从DVWA开始的渗透初体验(一)
环境准备
主要目的是想快速练练手,而本人又是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_user
和db_password
的值改为mysql数据库的用户名和密码。
解决这几个小问题,之后的部署和使用就顺风顺水了。
Brute Force
用户名和密码登陆,有爆破和SQL注入两种办法。
首先是暴力破解,记录下Burp Suite
内Intruder
模块的使用心得。
先跑几个包分析下构成,看到username
和password
两个分别传递用户名和密码的字段后就可以把包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远离玄学。
想想你的文章写的特别好
看的我热血沸腾啊https://www.ea55.com/