url跳转漏洞

CVE-2017-7233漏洞利用

既然是url跳转漏洞,我们就需要让其跳转到指定的url里,https:2333333333这样的url明显是无法访问的,而冒号之后必须纯数字,http:127.0.0.1是无法pypass的。有什么方法呢?其实ip不仅只有常见的点分十进制表示法,纯十进制数字也可以表示一个ip地址,浏览器也同样支持。将IP的点分十进制,逐位转换为16进制然后拼接在一起转为10进制即可(在线转换器:http://www.ipaddressguide.com/ip)

      例如:

      127.0.0.1 == 2130706433,

      8.8.8.8==134744072,

      而'https:134744072'是在浏览器上是可以访问到对应的ip及服务的,即'http:134744072 = https://8.8.8.8/'

      那么如何利用这个漏洞呢?Django默认自带的admin使用了is_safe_url来处理next GET | POST参数,当用户访问/admin/login/?next=https:134744072 进行登录时,登录后同样会跳转到8.8.8.8,退出登录时同样使用到了该函数。

     

      启动django,python manage.py runserver 0.0.0.0:8000

       url跳转漏洞

      打开浏览器,输入地址http://127.0.0.1:8000/admin,输入帐号admin,密码admin123,即可正常登录,退出登录接下来我们来模拟攻击者使用url跳转漏洞进行钓鱼攻击。攻击者拥有一个钓鱼页面https://10.1.1.136,首先需要将点分10进制ip转换为纯数字10进制ip。

      打开命令行,输入python进入Python的CLI,使用hex()函数及int()函数将点分十进制的IP转换为纯十进制的表示

       url跳转漏洞

      构造漏洞url:http://127.0.0.1:8000/admin/login/?next=https:167838088

      攻击者发送此连接给受害用户,当用户使用此链接登录成功之后,就会跳转到https://10.1.1.136/index.html

      钓鱼页面源码

       url跳转漏洞

      

     钓鱼页面前端有一个登录框,如果用户安全意识不足,再次输入帐号密码,则会被钓鱼页面记录帐号密码写入到服务器的hetianlab.txt,然后再跳转回正常的登录后页面

     模拟受害者用恶意链接,登录帐号密码admin/admin123

      url跳转漏洞

      登录成功随后就跳转到https://10.1.1.136/

      然后模拟受害者再次输入帐号密码,点击登录之后就跳转回登陆成功之后的页面,同时攻击者也利用钓鱼页面记录到了受害者的帐号密码

      在钓鱼页面输入密码后跳转回正常网站后台

       url跳转漏洞

      访问https://10.1.1.136/lab.txt,可以看到攻击者记录到的受害者帐号密码,真实情况下,攻击者会搭建一个和正常网站一模一样的钓鱼网站用于迷惑受害者进行攻击记录帐号密码。

      url跳转漏洞

 

url跳转漏洞修复

      1. 若跳转的URL事先是可以确定的,包括url和参数的值,则可以在后台先配置好,url参数只需传对应url的索引即可,通过索引找到对应具体url再进行跳转;

      2. 若跳转的URL事先不确定,但其输入是由后台生成的(不是用户通过参数传入),则可以先生成好跳转链接然后进行签名,而跳转cg首先需要进行验证签名通过才能进行跳转;

      3. 若1和2都不满足,url事先无法确定,只能通过前端参数传入,则必须在跳转的时候对url进行按规则校验:即控制url是否是你们公司授权的白名单或者是符合你们公司规则的url

     url跳转漏洞

      4. XSS漏洞的注意事项 :跳转url检测中也加入了CRLF头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a这种测试代码,需要对这些参数进行删除处理(事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。

      5. 开源项目及时进行升级,如Django升级 pip install django --upgrade