上篇介绍了DVWA的背景、环境部署以及Brute Force的时间过程,该篇继续CommandInjection和CSRF。
Command Injection
命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。
4.1 Low等级
4.1.1 漏洞分析
根据源代码我们可以看到,对输入的ip没有作任何过滤,直接将它拼接即可执行命令,php_uname(‘s’)根据参数不同可以获取系统的不同信息,stristr(string, search_string, bool)可以在string中搜索search_string 并将第一次匹配处及以后的字符串列出,如果没找到则返回false,在php中非空字符串为真,则可以判断系统类型。
4.1.2 使用连接符
这里可以使用命令连接符来让网页执行额外的命令,常见的命令连接符如下:&&(前面执行成功执行后面),||(前面执行失败执行后面)。这里由于对输入的ip字段没有做任何过滤,这里的payload可以选择10.33.10.52&&net user。这里就会在执行完ping命令后执行net user,结果如下,可以发现命令执行成功,表明任意cmd命令执行漏洞存在。
4.2 Medium等级
4.2.1 漏洞分析
设置为Medium等级,源码对&&和;进行了过滤,如果有该字符则替换为空字符,采用了黑名单的机制。
4.2.2 改用其他连接符
因为只有&&和;被过滤,所以可以选择其他的连接符&(不管前面执行是否成功都会执行后面)来进行注入,payload为10.33.10.52&whoami,结果如下,证明漏洞仍然存在。
4.2.3 利用黑名单漏洞
因为根据源码发现这里只进行一遍过滤,所以我们可以将;放置在&&之间来绕过,str_replace只会检测到;并将其替换为空字符,之后两个%%就完成拼接,过滤后就包含了&&符号,因为只过滤一次,所以成功的绕过了该黑名单,具体的payload可以是10.33.10.52&;&dir,结果如下,证明可以命令注入。
4.3 High等级
4.3.1 漏洞分析
设置为High等级,源码改动如下,发现为了防止Medium利用黑名单漏洞绕过,他对单个字符也做了过滤,这样就不能按上述那样绕过了,进一步增强了安全性。
4.3.2 使用黑名单以外的字符进行注入
虽然High等级的黑名单范围包括很全,但是还是遗漏了一些连接符,比如可以利用|(管道符前一个命令的输出是后一个命令的输入并且只打印后面命令的结果),这里我们可以使用如下payload来进行验证,10.33.10.52|net user junlin。由于|的特性,只会显示后一个命令的执行结果,结果如下
4.4 Impossible等级
设置为Impossible等级,源码改动如下,可以发现加入了Anti-CSRF token,同时他将输入的命令通过stripslashes去掉反斜杠,由于规则是要输入ip地址,所以根据.来将输入的命令分成四个数组,之后通过is_numeric判断每个数组是否为数字且是否只有四个数组,判断成功后,按固定的ip格式重新组合地址,达到严格的参数限制,只有num.num.num.num才能执行。利用参数化的方式很好的避免了黑名单考虑不全和容易绕过的缺陷,防止了命令注入。
CSRF
CSRF全称Cross-site request forgery即跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(转账、改密等)。CSRF并没有盗取Cookie而是直接利用。
5.1 Low等级
5.1.1 漏洞分析
设置为Low等级,源码如下。可以发现服务器收到修改密码请求后,会判断两次密码输入是否相同,如果相同就会修改密码,并没有任何防护CSRF的机制,当然服务器会验证请求发送者的cookie,只是代码没有体现。
5.1.2 构造原始链接
我们的攻击方式如下图所示,所以我们需要构造一个受害人打开后可以自动修改密码的链接,这样受害人在未退出系统会话未断开的情况下,点击链接就会发出修改密码请求。
这里我们先构造最简单的链接,利用Burp截取修改密码请求即可。链接如下
http://172.10.172.3/dvwa/vulnerabilities/csrf/?password_new=5211&password_conf=5211&Change=Change
用户在账户已登录的情况下(未关闭浏览器),且使用相同浏览器请求上述链接后,就会执行修改密码操作。
当然这里可以把链接进行缩短来隐藏提示信息,但是用户请求后还是会显示密码修改成功的消息
5.1.3 构造攻击页面
现实攻击中,可以将链接嵌入到一个伪造的页面(包含引诱信息)中,这样用户点击以后不会知道隐藏在页面中的连接已经执行,而是认为打开了一个别的页面。
这里伪造一个这样的页面,代码如下
将该文档命名为csrf_low.html(实际情况设置具有诱惑力的名字),这里为了方便测试,放入到同一个服务下,链接为http://172.10.172.3/csrf_low.html。受害者点击后页面如下,但是实际上修改密码的请求已经通过请求img链接发生,从而达到了修改密码的目的,验证可得密码修改,漏洞存在。
5.2 Medium等级
5.2.1 漏洞分析
设置为Medium等级,源码变动如下,stripos(string, find)是执行查找find字符串在string字符串的位置,如果不含有find字符串则返回false,该函数和stristr类似。这里加了一个修改密码请求的HTTP头中的referer中是否含有Server_name(也就是Host内容),因为referer是表明该请求是从哪个页面链接过来的,如果我们伪造了一个网页并内容有修改密码的链接,那么修改密码的请求的referer内容就是伪造的页面链接,而这个链接很明显不含有请求修改密码的服务器Host,所以可以达到防护的效果。
5.2.2 将伪造页面保存到密码修改页面服务器
因为我们为了测试方便,在Low方法中的伪造页面,我们直接放到了DVWA部署的服务器上,所以它的链接http://172.10.172.3/csrf_low.html含有修改密码请求的Host(172.10.172.3),这样就满足了referer中含有server_name,所以即使是Medium等级,用Low等级的链接仍然可以使用,这里的绕过有一定的侥幸,是因为我有上传到修改密码服务器html页面的权限,但是换句话说,如果该服务器存在任意文件上传漏洞,就可以将csrf_low.html传入到服务器,然后诱导用户点击,这样就满足了Medium的要求。
5.2.3 将伪造的html页面命名为Host内容
上述的方法有取巧的嫌疑,所以我们需要想别的方式,这里要求referer中只要包含Host即可,那么可以让伪造的页面命名为Host的内容即可。为了体现效果,这里将伪造页面放到与DVWA不同的服务器上,链接为http://172.10.172.2:8080/csrf_low.html。这个时候,请求截取如下,可以看到referer中不含Host,所以修改失败,响应显示请求不正确。
我们将文件名字更改为Host内容172.10.172.3.html,这样可以保证referer中含有Host内容,链接就变为http://172.10.172.2:8080/172.10.172.3.html,此时用户点击后,查看响应修改成功,结果如下
5.3 High等级
5.3.1 漏洞分析
设置为High等级,改动如下,加入了Anti-CSRF token机制,这样在每次请求修改密码的时候要加入上次访问页面返回的token。这样就需要获得用户访问页面所返回的token,然后再发送即可。
5.3.2 构造攻击页面
这里构造一个攻击页面,当用户点击后,通过一个看不见的iframe偷偷访问修改密码的页面即向http://172.10.172.3/dvwa/csrf发送请求,而后利用jsp的document.getElementById、document.getElementByName等函数获取页面中的user_token,然后再利用获取的user_token发送如下请求,user_token为获取的值http://172.10.172.3/dvwa/vulnerabilities/csrf/?password_new=1&password_conf=1&Change=Change&user_token=user_token,之后就可以执行修改密码的操作。
但是这里有一个问题,我们第一步中需要先获取修改密码页面的内容,但是受害者访问的页面的域名和修改密码页面的域名不一致,浏览器不允许跨域请求,也就是不允许在访问域名B所有页面的时候主动获取A的页面内容,除非域名A主动发信息给域名B,所以这里只有将构造的页面放置到修改密码页面同一域名下,才可以实现。这里同解决Medium问题一样,可以利用文件上传漏洞,将伪造页面放置在与修改密码页面同一域名下来实现。
5.3.3 利用存储型XSS获取token
这里还可以利用存储型XSS,将获取token的jsp脚本注入到页面中,当受害者浏览该页面的时候,就会执行注入脚本从而攻击者获得user_token,然后就可以利用获得的user_token构造和Low等级相似的攻击页面,诱导受害者点击,这样就会达到修改密码的目的。
5.4 Impossible等级
设置为Impossible等级,加入了原始密码的验证,只有输入原始密码并且正确才会执行修改密码的操作,有效的防止了CSRF攻击。而且使用了PDO机制来防止SQL注入。
更多内容请持续关注本专栏,谢谢~
来源:freebuf.com 2020-02-25 16:42:57 by: Scorpio君临天下
请登录后发表评论
注册