环境准备

主要目的是想快速练练手,而本人又是Linux菜鸟,因此选择了对我而言最快最方便的win7+phpStudy部署环境。

用小白式操作光速启好web服务,成功访问到phpStudy默认index页,还没怎么享受这种简单的快乐就遇到了问题,自己折腾无果,还是得求助度娘。

都是前人踩过的坑,总结如下:

访问网站目录下的DVWA安装文件报错403

起初以为是本地用户权限不足导致无法执行网站根目录下的文件,但给了完全操作权限还是不行。

我使用的phpStudy的版本是最新的v8.1.1.2,默认能访问的PHP文件只有index引导页。在“网站” > “管理” > “修改” > “高级配置”选项卡里打开目录索引,删除原先的index页,然后就能访问网站根目录下的所有文件。

无法安装DVWA

配置文件config.inc.php.dist没有删除.dist后缀,不认识这个文件类型自然无法执行。这是我粗心大意了,没意识到新装的win7系统默认隐藏文件后缀名。

Could not connect to MySQL service,please check the config file.

无法连接数据库。修改配置文件config.inc.php内关于数据库的参数,把db_userdb_password的值改为mysql数据库的用户名和密码。

解决这几个小问题,之后的部署和使用就顺风顺水了。

Brute Force

用户名和密码登陆,有爆破和SQL注入两种办法。

首先是暴力破解,记录下Burp SuiteIntruder模块的使用心得。

先跑几个包分析下构成,看到usernamepassword两个分别传递用户名和密码的字段后就可以把包Send to Intruder转到攻击模块了。

  • Target
    设置目标主机的IP和端口,相当于先把枪架起瞄准目标,简单的参数决定了之后所有的攻击能否命中目标。
  • Positions
    构造Payload的地方,刚刚传过来的数据包就在这里,选中需要爆破的字段后点击Add §,被§这个奇怪字符包裹的参数就是爆破点。话说我一度把§认错成$
    Attack type爆破模式有四种可选:

    Sniper(狙击手):用于单参数爆破。若只有一个爆破点,正常跑字典里所有payload值;若有多个爆破点,则按照顺序依次跑字典(同一个字典,只能选择一个payload set),每次只有一个爆破点的参数会变化。
    Battering ram(攻城锤):单个爆破点时与Sniper相同,若有多个爆破点,则跑字典时payload值同时填充在每个爆破点,即所有爆破点每次的payload值都相同。同样只能用一个字典。
    Pichfork(干草叉):多个爆破点使用不同的字典,多个字典平行执行,互不相干。如果其中一个参数较少的字典把所有payload值跑完了,则不管其他字典是否跑完都停止爆破。
    Cluster bamb(集束炸弹):多爆破点多字典,笛卡尔积式跑字典。
  • Payloads
    设置payloads值,装填弹药。
  • Options
    调整攻击的具体细节,包括是否更新请求头、线程数量、捕获信息类型、标记指定的响应内容等。

比起枯燥的爆破,SQL注入显得更具魅力和美感。在low难度中,服务器没有做任何过滤措施,使用最简单的SQL注入:万能密码。

//获取输入的用户名$user和密码$pass后,去数据库查询比较
$query  = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";

以上这句就是源码中的注入点,由于$pass函数在获取到值后会用md5加密,所以无法在密码栏进行注入。

//admin' or '1'='1
$query  = "SELECT * FROM `users` WHERE user = 'admin' or '1'='1' AND password = '$pass';";
//admin'#
$query  = "SELECT * FROM `users` WHERE user = 'admin'#' AND password = '$pass';";

SQL注入的至关重要的一点就是引号的闭合,否者数据库会报错,而方法无外乎两种:要么构造,要么注释。

该题在medium难度中增加防注入措施,使用mysql_real_escape_string()函数转义字符串中的特殊字符:\x00\n\r\'"\x1a。而在High难度中更进一步使用stripslashers()函数删除输入内容的所有反斜杠。

这些函数把输入内容充分过滤,基本无法实现SQL注入。

Command Injection

命令注入,构造输入参数执行恶意代码。

$cmd = shell_exec( 'ping  ' . $target );

$target是输入的参数,未作任何措施,直接传进shell_exec()函数。

虽然用ping拼接传入参数,但并不能限制我们只执行ping操作,可以利用连接符&&||等执行多条指令。

//127.0.0.1 && dir
windows> ping  127.0.0.1 && dir

Medium难度增加了一个若有若无的过滤:

$substitutions = array(
    '&&' => '',
    ';'  => '',
);
$target = str_replace(array_keys($substitutions), $substitutions, $target);

str_replace()函数把输入参数中的&&;字符替换成空字符,但其他连接符如|||&完全不受影响。也可以巧妙运用过滤机制,用&;&实现&&

High难度有点凑数的意思,机制照搬Medium,但把黑名单做了完善。留下的纰漏可能是代表人员疏忽?

这里还遇到一个未解决的问题,网络教程里普遍使用的net user命令我无法成功执行,结合返回输出的中文乱码,大胆猜测是因为命令中含空格,但系统字符集不同,空格被转码成其他符号导致命令无法执行。把配置文件C:\phpstudy_pro\WWW\DVWA-master\dvwa\includes\dvwaPage.inc.php中字符集格式改成gbk编码(默认utf-8)。然后输出正常了,但net user还是不执行……试了下其他含空格的命令,竟然都是正常输出……好吧,是我天真了。又怀疑是权限问题,测试了一会儿觉得不像。尝试用net user命令创建新用户,失败,确认是未执行而非未返回输出。瞎折腾半天无果。

百度上看到一个回答说是phpstudy配的环境问题,但我更换了他推荐的php和Apache版本仍旧失败。看来以后还是多用linux吧,远离windows远离玄学。

标签: DVWA, SQL注入

添加新评论