DVWA代码审计及渗透攻略(上)——暴力破解、命令行注入、CSRF

congtou 2016-10-20 渗透技巧 0 4

DVWA(Dam Vulnerable Web Application)是用PHP+Mysql编写的一套用于常规Web漏洞教学和检测的Web脆弱性测试程序。它包含了SQL注入、XSS、盲注等常见的一些安全漏洞。本文对DVWA所有难度的代码进行了审计,并给出了POC和修复方案。

本篇是这一系列的上集,包含3种常见漏洞(暴力破解、命令行注入和CSRF)的验证和渗透实例。

Brute Force - 暴力破解

攻击介绍

暴力破解是指通过枚举的方式扫描用户的用户名及密码,从而达到未授权登录的目的。如果暴力破解配合撞库攻击,则会造成更大的危害,上个月Github遭到装库攻击,大量工程师Github账号及明文密码泄露。

Low Security Level

Writeup

用burpsuite直接上常用密码字典,瞬间出结果。

 

图1
  username:admin password:password

这里还有一个邪道的登录方式——SQL注入,即用户名提交”admin’ – “。

代码审计

07

出问题的代码如上,因为对输入错误的密码没有任何限制,导致可以暴力破解;GET的参数没有过滤SQL符号。

Medium Security Level

Writeup

和Low步骤一样,上Burpsuite,速度明显慢了,但是还是能枚举出来。
图1
username:admin password:password

代码审计

相较于Low的代码,Medium加入了

25

如果密码错误,则sleep2秒,有效增加了暴力破解的成本,但是治标不治本仍然可以被暴破。

High Security Level

Writeup

继续用Burpsuite暴破,发现除了增加了随机sleep,还增加了user_token的验证,程序员普遍认为有了token就可以防止暴力破解,然而——token在Burpsuite大法面前根本没用……
在Burpsuite添加Session Handling Rules,添加macro用来获取token然后post。
剩下的就和Low一样了,速度感觉更慢了,但是还是能枚举出来。
图1
username:admin password:password

代码审计

增加了token:

36

其实也并不安全,毕竟用户能够接收到token,所以一定可以转发token。High Level也只能挡住一般的script kids。

Command Injection (Windows) - 命令行注入

攻击介绍

命令行注入是一种比较邪门的攻击方式,毕竟现在的Web服务需要用户自定义调用的命令行操作越来越少,但是一旦漏洞被发现,攻击者可以轻易的取得服务器权限。命令行注入的原理是提交非法的命令行操作。

Low Security Level

Writeup

输入127.0.0.1 | dir,直接显示目录,说明注入成功。
图2

代码审计

整个服务的逻辑代码为

56

收到一个IP地址之后,直接把IP地址放在ping命令之后,但是命令行可以通过连接符来达到一行执行多个语句的效果,常用的连接符有:&, |, &&, ||,每个连接符都有不同的含义,但是经过构造都能实现一行命令行语句执行多个命令,具体的可以在网上查一下。

Medium Security Level

Writeup

同Low。

代码审计

加入了如下过滤代码

141

然并卵,仍然可以使用其他的连接符。

High Security Level

Writeup

这个比较有难度了,不看代码感觉有点难。提交127.0.0.1 |&| dir,注入成功。
图2

代码审计

这次过滤了更多的字符

348

基本上是把能过滤的都过滤了,但是仔细分析,发现过滤的规则中’|’的过滤有问题,过滤的是’| ‘而不是’|’,有一个空格,所以可以构造一个不带空格的或符号。所以如果构造’127.0.0.1 |&| dir’,经过一次转换后就会变成’127.0.0.1 || dir’,就成功了。
图3

CSRF - 跨站请求伪造

攻击介绍

跨站请求伪造是指伪造一段服务器信任的数据来欺骗服务器,达到攻击的目的。常见的CSRF经常发生在诱导被攻击者点击经过精心构造的链接从而劫持被攻击者的操作。这种攻击很难单独实现,通常需要配合社会工程需或XSS攻击。

Low Security Level

Writeup

点击更改密码后,直接传递参数http://192.168.61.128/DVWA-1.9/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
因此,可以构造任意参数以实现CSRF攻击。
图3

代码审计

551

从代码中可见,PHP直接接受传递进来的两个参数password_new和password_conf,然后在数据库中更新dvwaCurrentUser()的密码,这是非常危险的做法。攻击者可以构造链接http://192.168.61.128/DVWA-1.9/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#诱导管理员点击从而更改密码。

Medium Security Level

Writeup

Medium难度判断了来源站点,所以这里的CSRF需要配合上其他攻击方式了,比如XSS。要将Low难度的链接以XSS的方式插入到DVWA站点上才能使CSRF生效,可以在XSS-Reflected或者XSS-Stored中构造如下Payload使CSRF攻击生效:

1<script>window.open(“http://192.168.61.128/DVWA-1.9/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#”)</script>

代码审计

在Low的基础上,添加了如下判断:

825

即判断链接的来源是否合法:如果HTTP头中的Host和SERVER_NAME一致才进行下一步操作。有了这种判断,CSRF只能通过XSS的方式实现了。

High Security Level

Writeup

这次加入了Anti-CSRF,我一直没有很好的办法,我的处理办法是和XSS一起利用,在XSS中来获取用户的token然后再post到目标地址去。
我的做法是在其他页面构造XSS脚本:

 

<script>
var tokenValue = document.getElementsByName("user_token").item(0).value;
var target = “http://192.168.61.128/DVWA-1.9/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change&user_token=" + tokenValue;
window.open(target);
</script>

当这个XSS实现的时候,CSRF也就自然实现了,而且还附带了正确的token。

代码审计

在Low的基础上,High加上了变态的Anti-CSRF token,这种方法被广泛的用于Web应用的修改密码或者发帖功能中:

140

有了Anti-CSRF token,基本上又要和XSS一起利用了。而且应为这个token的存在,XSS插入的脚本要更加的复杂,但是experienced hacker还是有机会CSRF成功的。

安全编程

Brute Force

防暴力破解应该是工程师的基本功了,既可以从服务器来限制访问,也可以在Web实现。

  1. 设置token:设置token可以初步防止Script Kids使用暴力破解工具对网站的登录接口进行扫描;
  2. 设置最大尝试次数:通过限制最大输入错误密码次数来隔绝暴力破解,如果错误次数超过限制,则锁定账号一段时间;
  3. 使用mysql_real_escape_string()函数对POST数据进行检查,隔绝SQL弱口令攻击;
  4. 不使用明文密码;

所以代码需要添加如下模块:

313

Command Injection

防止命令行注入(可以说是一切注入)的基本手段都是过滤。

  1. 设置token:设置token可以初步防止Script Kids使用工具无限次尝试注入;
  2. 使用正则或自定义的规则(最安全的做法是白名单)来过滤和规范输入数据;

// token设置
checkToken( $\_REQUEST[ 'user_token' ], $\_SESSION[ 'session_token' ], 'index.php' );
// 设置过滤规则,最好是白名单
$target = $\_REQUEST[ 'ip' ];
$target = stripslashes( $target );
$octet = explode( ".", $target );
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
        $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];

CSRF

防止CSRF的方法因人而异,不用的页面需要有不同的方法,这里以修改密码应用为例。

  1. SQL语句检测;
  2. 修改密码时一定要验证原密码;
  3. 使用Anti-CSRF token;
  4. 不使用明文密码;

// Anti-CSRF token
checkToken( $\_REQUEST[ 'user_token' ], $\_SESSION[ 'session_token' ], 'index.php' );
// 验证原密码
$pass_curr = $\_GET[ 'password_current' ];
$pass_new  = $\_GET[ 'password_new' ];
$pass_conf = $\_GET[ 'password_conf' ];
// 过滤SQL字符
$pass_curr = mysql_real_escape_string( $pass_curr );
// 计算散列值
$pass_curr = md5( $pass_curr );

 

 

转载请注明来自华盟网,本文标题:《DVWA代码审计及渗透攻略(上)——暴力破解、命令行注入、CSRF》

喜欢 (4) 发布评论