参考:
前言
https://github.com/digininja/DVWA
模块大榄
- Brute Force(暴力破解)
- Command Injection(命令行注入)
- CSRF(跨站请求伪造)
- File Inclusion(文件包含)
- File Upload(文件上传)
- Insecure CAPTCHA(不安全的验证码)
- SQL Injection(SQL注入)
- SQL Injection (Blind)(SQL盲注)
- XSS (Reflected)(反射型跨站脚本)
- XSS (Stored)(存储型跨站脚本)
DVWA 1.9的代码分为四种安全级别:Low,Medium,High,Impossible。初学者可以通过比较四种级别的代码,接触到一些PHP代码审计的内容
通关开始
第一关-Brute Force
LOW
PHP 代码——查询验证用户名和密码
1 | $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; |
PHP 代码——登录前的验证
1 | # 请求不为空,查得到结果就行 |
SQL
在登录框中输入
1 | admin' or '1' = '1 |
1 | SELECT * FROM `users` WHERE user = 'admin' or '1'='1' AND password = '' |
Medium
PHP 代码
1 | $user = mysql_real_escape_string( $user ); |
单引号没有了,变成了转义\
1 | GET /DVWA-master/vulnerabilities/brute/?username=admin&password=password&Login=Login HTTP/1.1 |


High
多了token这个参数,过滤低级的爆破,校验
先抓包,火狐浏览器地址栏是明文的
1 | GET /DVWA-master/vulnerabilities/brute/?username=amdin&password=123&Login=Login&user_token=1884203513ab2b438bc4ec3182f62a65 HTTP/1.1 |
第二关-Command Injection
LOW
php 代码
1 |
|
网页输入
1 | 127.0.0.1 && ipconfig |
Medium
High
第三关-CSRF
跨站请求伪造,有人戏谑为借刀杀人,借用户之刀,做恶行之事也
LOW
映入眼帘的是一个修改密码的界面,输入密码之后123 123 后,在地址栏中观察到

从而得知这是 GET 型提交,且这就是修改密码的链接。我们直接在地址栏中修改密码456,然后复制链接重新打开一个界面(需要注意的是,打开的界面必须在同一个浏览器,原因是 cookie 认证)

如图所示显示密码已更改,同时原密码123失效了。
但显然,长而冗杂的链接是令人厌烦的,诱导用户点击的话,可以通过构造短链接的形式,直接搜索“在线 短链接”即可找到

如何查看重定向之前的链接呢,可以借用curl -i url

Medium
和 Low 级别相比,增添了 referer 判断。
referer 作为 HTTP 头中的一个字段,记录了 HTTP 请求的来源地址。
通过输入密码 123,通过 burp 抓包看看。

重复上次的操作,重新打开一个界面,在 burp 中进行抓包,发现没有 referer 字段

接下来可以在 burp 中手动伪造 referer 来执行 CSRF 攻击
1 | Referer: http://localhost/DVWA-master/vulnerabilities/csrf/ |

High
增加了 token 机制,当用户往服务器发送请求的时候,服务器通过校验请求是否携带正确的 Token,才会响应请求。
因为 GET 请求的参数会暴露在 URL 中,所以输入密码之后查看一下 token

第十关-XSS (DOM)
Low
1 | document.write("<option value='" + lang + "'>" + $decodeURI(lang) + "</option>"); |

Medium
1 | if (stripos ($default, "<script") !== false) { |

High
1 | if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) { |

第十一关-XSS (Reflected)
LOW
1 | // Is there any input? |

Medium
1 | if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { |

High
1 | '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i' |

第十二关-XSS (Stored)
LOW
1 | // payload |
1 | -- 从数据库中查看 |


Medium
1 | // payload |
High
1 | // payload |