DVWA Writeup
复习一些web强身健体(不是
其中webshell部分的eval被我改成了evaltest,不然windows defender总报…
环境
https://github.com/ethicalhack3r/DVWA
docker启动 docker run --rm -it -p 80:80 vulnerables/web-dvwa
默认凭证: admin/password
https://www.freebuf.com/articles/web/274058.html
burp的四种攻击模式:https://blog.csdn.net/huilan_same/article/details/64440284
Brute Force
low
|
|
get请求中的username和password可以直接爆破
将请求数据发送到 Intruder
模块进行暴力破解,爆破字典使用 Kali 内置的字典/usr/share/wordlists/fasttrack.txt
,使用 §
符号标记需要测试的数据
根据返回的数据长度推测爆破成功,即密码为 password
medium
|
|
对user和pass进行了过滤,使用了mysql_real_escape_string
函数,会对字符串中的特殊字符进行转义,防止注入。而且在失败以后添加了sleep函数,爆破会慢一些,但是步骤不变。
high
|
|
加入的token来防御CSRF同时增加爆破难度。
同样使用 Burp Suite,先将请求数据发送给 Intruder
模块,用 §
符号标记需要测试的两个数据,一个是 password
,另一个是 user_token
,本次使用 Pitchfork
攻击方式。
在 Option 选项中找到 Grep - Extract,设置从响应中获取 user_token
,这里用光标选中想要的内容即可。
第一个数据 password
仍然使用 Kali 内置的爆破字典 /usr/share/wordlists/fasttrack.txt
;
第二个数据 user_token
从响应页面中递归获取,起始数据为当前未提交登录的页面的 user_token
。
根据响应长度排序可以得到正确的password
Common Injection
命令注入(Command Injection),对一些函数的参数没有做过滤或过滤不严导致的,可以执行系统或者应用指令(CMD命令或者bash命令)的一种注入攻击手段。PHP命令注入攻击漏洞是PHP应用程序中常见的脚本漏洞之一
shell 环境中用于拼接命令的符号有以下几个:
|
|
low
|
|
没有加任何防护,直接注入命令127.0.0.1 && whoami
medium
|
|
在 Low 的基础上使用 str_replace
过滤符号 &&
和 ;
。
||
、 |
、&
仍然可以使用,此外还可以使用 &&&
、 &;&
等,过滤后就变为 &
、 &&
,同样可以实现漏洞利用。
|
|
high
|
|
使用 trim
去除字符串首尾的空白字符,然后又过滤了许多符号,但是没有过滤 |
,显然可以利用。
使用管道符 |
即可。
|
|
CSRF
Cross-site request forgery,跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。
low
修改密码的链接:http://localhost/vulnerabilities/csrf/?password_new=132&password_conf=23&Change=Change#
在源码中只要password_new与password_conf一致即可修改密码。故直接发送上述链接吸引受害者点击即可修改密码。
medium
相比于low添加了如下校验:
|
|
即用户的请求头中的Referer字段必须包含了服务器的名字。
使用burp对其进行修改
high
加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器都会返回一个随机的token,当浏览器向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
http://localhost/vulnerabilities/csrf/?password_new=12&password_conf=12&Change=Change&user_token=14299b179fba1e1934cc198a1a884bdc#
|
|
这里想要达到攻击目的的话需要获取token。这里只有构造一个攻击页面,将其放置在目标服务器,引诱受害者访问,从而完成CSRF攻击。
|
|
如果把上述页面加入到目标服务器,当受害者点击这个页面,脚本会通过一个看不见的框架访问修改密码的页面获取页面中的token,并向服务器发送修改密码的请求,以完成CSFR攻击。
因为跨域问题,所以这个攻击代码需要注入到目标服务器中才可能完成攻击,可以利用XSS漏洞协助获取CSRF token。
文件包含
文件包含与漏洞
文件包含:
开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。
文件包含漏洞:
开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。
文件包含漏洞用到的函数
require:找不到被包含的文件,报错,并且停止运行脚本。
include:找不到被包含的文件,只会报错,但会继续运行脚本。
require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。
include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。
目录遍历与文件包含的区别
目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格,针对本系统。
文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含。
文件包含特征
|
|
检测方法
|
|
low
没有任何过滤,可以进行包含任意文件。
|
|
medium
添加了两个过滤条件:
|
|
使用 str_replace
函数进行过滤是很不安全的,因为可以使用双写绕过。例如,我们包含 hthttp://tp://xx
时, str_replace
函数只会过滤一个 http://
,所以最终还是会包含到 http://xx
|
|
high
添加了如下过滤:
|
|
fnmatch() 函数根据指定的模式来匹配文件名或字符串。
对包含的文件名进行了限制,必须为 file* 或者 include.php ,否则会提示Error:File not found。
可以利用 file 协议进行绕过。
|
|
文件上传
文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。
low
没有对文件做任何限制,可以直接上传webshell
|
|
将上述内容写入1.php文件进行上传
使用中国菜刀连接
medium
|
|
对文件类型进行了限制,只接受图片格式的文件。可以用burp进行文件名的修改
将这个1.jpg修改成1.php即可,后续步骤相同。
high
|
|
直接对文件名进行限制。
使用edjpgcom.exe工具制作图片马即可。
SQL注入
low
|
|
没有任何过滤直接手工注入
|
|
medium
|
|
添加了mysqli_real_escape_string
函数对特殊字符进行转义同时内容来自POST请求。转义的字符有:
|
|
数字型注入,不用使用上述特殊字符,使用hackbar
进行post
即可
|
|
high
|
|
添加limit 1
限制输出数量,使用注释可以忽略掉
MySQL 注释 #
或 --
(空格)其他与low相同
SQL盲注
用sqlmap做sql盲注
low
没做任何防护
- 判断注入点
|
|
- 获取数据库名称
|
|
- 获取当前连接的数据库
|
|
- 列出数据库中所有用户
|
|
- 获取当前操作的用户
|
|
- 列出可连接数据库的所有账户-对应的密码哈希
|
|
- 列出数据库中所有的数据表
|
|
- 列出数据表中所有字段
|
|
- 导出特定数据表中的字段
|
|
medium
POST
请求,参数在POST
请求体中传递。此时,构造SQLMap操作命令,则需要将url和data分成两部分分别填写,同时需要更新cookie信息的取值。
|
|
high
- High级别的查询数据提交的页面、查询结果显示的页面是分离成了2个不同的窗口分别控制的。即在查询提交窗口提交数据(POST请求)之后,需要到另外一个窗口进行查看结果(GET请求)。若需获取请求体中的Form Data数据,则需要在提交数据的窗口中查看网络请求数据or通过拦截工具获取。
- High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止常规的SQLMap扫描注入测试,因为SQLMap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入;但是并不代表High级别不能用SQLMap进行注入测试,此时需要利用其非常规的命令联合操作,如:
--second-order="xxxurl"
(设置二阶响应的结果显示页面的url),具体的操作命令可参看==>SQLMap工具使用选项的操作命令&功能
|
|
weak session ids
low: 使用+1的规则生成session
medium: 直接使用时间戳生成session
high: 使用md5计算session
上述三种都可以用Hackbar
和burp
来完成session预测
impossible使用随机数+时间戳+固定字符串(“Impossible”)进行 sha1 运算,作为 session Id。
XSS(DOM)
DOM树
HTML 文档的主干是标签(tag)。
根据文档对象模型(DOM),每个 HTML 标签都是一个对象。嵌套的标签是闭合标签的“子标签(children)”。标签内的文本也是一个对象。
所有这些对象都可以通过 JavaScript 来访问,我们可以使用它们来修改页面。
例如,document.body
是表示 <body>
标签的对象。
HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准
简单来说DOM主要研究的是节点
,所有节点可通过javascript访问(增,删,改,查)
对于DOM型的XSS是一种基于DOM树的一种代码注入攻击方式,可以是反射型的,也可以是存储型的
最大的特点就是不与后台服务器交互,只是通过浏览器的DOM树解析产生
可能触发DOM型XSS属性:
|
|
low
没有任何防护
|
|
将标签写成如下形式:
|
|
即可完成弹框。
medium
|
|
不允许<script>
标签。可以选择其他标签:<img src=1 onerror=alert(1)>
但是直接写在default后面解析会有问题:
<option>
标签里面没有值了。可以选择先闭合option标签,再闭合select标签。
|
|
或者直接闭合select
|
|
high
|
|
URL中#
号之后的内容,不会被提交到服务器,可以直接与浏览器进行交互
在正常url后输入:#<script>alert(document.cookie)</script>
即可。
XSS Reflect
low
没做过滤<script>alert(1)</script>
medium
|
|
对<script>
进行了过滤,有三种绕过方式
- 使用双写绕过,
<scr<script>ipt>alert(1)</script>
- 使用大小写绕过
sCript>alert(1)</script>
- 使用其他标签。
<img src=1 onerror=alert(1)>
high
|
|
正则匹配绕过<script>
,可以用img标签。
XSS Stored
low
|
|
isset()
函数在php中用来检测变量是否设置,该函数返回的是布尔类型的值,即true/false
trim()
函数作用为移除字符串两侧空白字符或其他预定义字符
stripslashes()
函数用于删除字符串中的反斜杠
|
|
进行转义。
在代码中对message,name输入框内容没有进行XSS方面的过滤和检查。且通过query
语句插入到数据库中。所以存在存储型XSS漏洞。
medium, high和上面反射类型的绕过方式相同
CSP bypass
CSP:浏览器的安全策略,如果标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy
标签 ,浏览器会根据标签里面的内容,判断哪些资源可以加载或执行
low
|
|
直接上pastebin网站写一个js的代码写进入即可
medium
|
|
http头信息中的script-src的合法来源发生了变化,说明如下
unsafe-inline
,允许使用内联资源,如内联< script>元素,javascript:URL,内联事件处理程序(如onclick)和内联< style>元素。必须包括单引号。nonce-source
,仅允许特定的内联脚本。nonce=“TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA”
|
|
high
|
|
CSP头中只有script-src 'self'
说明只允许本节面加载的js执行。js逻辑:
点击按钮 -> js 生成一个 script 标签(src 指向 source/jsonp.php?callback=solveNum), 并把它加入到 DOM 中 -> js 中定义了一个 solveNum 的函数 -> 因此 script 标签会把远程加载的solveSum({"answer":"15"})
当作js代码执行。
但是服务端的代码中,可以接收include传入的参数。
callback 参数可以被操控以生成任何你想要得到的结果, 比如 alert, 因此可以构造 Payload:
|
|
把这个当做 include 参数传给界面就注入成功
JavaScript
low
|
|
输入success带token:
medium
|
|
将phrase变量的值逆序,也就是sseccus;生成的token值XXsseccusXX
high
|
|
js被加密,解密:http://deobfuscatejavascript.com/#
|
|
大致原因是中间jsdocument.getElementById("phrase").value = "";
输入的内容被置空。可以借助chrome的调试器修改这个内容。具体操作方式见https://www.codenong.com/cs106723183/
就是在如下两处下断点:
在console中输入document.getElementById("phrase").value = "success";
修改值。
参考链接
https://www.freebuf.com/articles/web/274058.html
https://jckling.github.io/2020/04/23/Security/DVWA/2.%20Command%20Injection/
https://segmentfault.com/a/1190000019484055
https://www.jianshu.com/p/ec2ca79e74b2