sqli-labs靶场安装以及刷题记录-dockerpikachu靶场-Cross-Site Scripting
- pikachu靶场的安装
- 刷题记录
- 反射型xss(get)
- 反射型xss(post)
- 存储型xss
- DOM型xss
- DOM型xss-x
- xss盲打
- xss之过滤
- xss之htmlspecialchars
- xss之href输出
- xss之js输出
pikachu靶场的安装
刷题记录
反射型xss(get)
输入设置了长度限制,前端可以直接改
改maxlength值,之后输入脚本成功注入
<script>alert(1)</script>
反射型xss(post)
执行登陆操作,登陆成功后有一个输入框,可以输入注入语句
存储型xss
同样直接输入注入语句试试
<script>alert(1)</script>
直接弹窗了,看下源码,没有任何过滤
DOM型xss
输入aaaaaa
,点击click me
会生成一个链接,那可以让它指到刚刚的存储型xss网站来触发弹窗
输入xss_stored.php
,点击what do you see
DOM型xss-x
输入123444
,观察源码
输入123444
后,依次点击所弹出的链接,url变化为
//请说出你的伤心往事
/vul/xss/xss_dom_x.php?text=123444
//有些费尽心机想要忘记的事情,后来真的就忘掉了
/vul/xss/xss_dom_x.php?text=123444#
//就让往事都随风,都随风吧
/vul/xss/123444
同样可以输入xss_stored.php
使其跳转到存储型xss网站来触发弹窗
xss盲打
输入各种语句都是一样的回显,看了提示有后台/xssblind/admin_login.php
打开后台页面,会弹窗刚刚提交的注入语句
刚好配置一下文件扫描工具dirsearch
,下载zip解压直接
python dirsearch.py -u http://ip:9002/vul/xss/xssblind/
conda create --name py39 python=3.9//需要3.9及以上版本python
xss之过滤
输入注入语句试试
<script>alert(1)</script>
发现回显只剩一个>
了,被继续测试,猜一下过滤规则,发现大小写混合可以绕过
<Script>alert(1)</Script>
xss之htmlspecialchars
输入注入语句,之后点击链接弹窗成功
javascript:alert(1)
相关知识点学习:
htmlspecialchars()
是一个用于避免 XSS(跨站脚本攻击) 的 PHP 函数,它的主要作用是将 HTML 特殊字符转义为实体编码,从而防止恶意用户在输入内容中注入 HTML 或 JavaScript 代码。这是常见的 Web 应用程序中用户输入处理的重要部分,尤其是在显示数据时。
基本用法
htmlspecialchars(string $string, int $flags = ENT_QUOTES | ENT_SUBSTITUTE, string $encoding = 'UTF-8', bool $double_encode = true): string
参数说明
-
$string:
- 这是需要被转义的字符串。通常是用户输入的数据。
-
$flags:
- 这是可选参数,用来指定如何处理不同的字符。常见的标志有:
ENT_COMPAT
:默认。将双引号 ("
) 转义为"
,但不转义单引号 ('
)。ENT_QUOTES
:将双引号和单引号都转义。也就是说,"
会转义为"
,而'
会转义为'
。ENT_NOQUOTES
:不转义任何引号。ENT_HTML401
,ENT_XML1
,ENT_XHTML
,ENT_HTML5
:这些用于指定 HTML 实体的文档类型(HTML 4.01、XML 1、XHTML、HTML5)。ENT_SUBSTITUTE
:当给定的字符集无法表示某些字符时,使用替代字符。
- 这是可选参数,用来指定如何处理不同的字符。常见的标志有:
-
$encoding:
- 这是字符编码的选项。默认值是
UTF-8
,但可以根据需要设置为其他编码(如ISO-8859-1
)。
- 这是字符编码的选项。默认值是
-
$double_encode:
- 如果设置为
false
,则不会对已经被转义的实体再次进行转义。例如,如果字符串中已经包含&
,它不会再次转义为&amp;
。默认为true
。
- 如果设置为
常见例子
-
基本用法:
$input = "<script>alert('XSS');</script>"; echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
输出:
<script>alert('XSS');</script>
htmlspecialchars()
将<
转义为<
,>
转义为>
,从而避免了用户输入的 JavaScript 被浏览器解释和执行。
-
处理双引号和单引号:
$input = 'He said, "Hello!"'; echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
输出:
He said, "Hello!"
ENT_QUOTES
标志确保了双引号被转义为"
。
-
避免重复转义:
$input = '<strong>Hello</strong>'; echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8', false);
输出:
<strong>Hello</strong>
- 因为
double_encode
参数被设置为false
,所以已经转义的实体不会再次被转义。
- 因为
使用场景
-
显示用户输入的数据:
当用户提交包含 HTML 或 JavaScript 的数据时,直接输出可能会被浏览器解释并执行。这会导致跨站脚本攻击(XSS)。htmlspecialchars()
可以有效防止这种情况。$comment = "<script>alert('hacked');</script>"; echo htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
这样可以确保用户输入的
<script>
标签不会被执行,而是显示为普通文本。 -
防止 XSS 攻击:
用户通过表单提交恶意代码是 XSS 攻击的常见方式。通过使用htmlspecialchars()
,可以将这些恶意代码转义为普通文本,防止被执行。 -
与数据库结合使用:
当你将用户输入的数据存入数据库并从数据库读取数据进行展示时,使用htmlspecialchars()
来展示用户生成的内容是一个好习惯。它能确保显示的数据是安全的,而不是被解析为 HTML 或 JavaScript。
转义的字符列表
&
转义为&
<
转义为<
>
转义为>
"
转义为"
'
转义为'
(仅在ENT_QUOTES
标志下)
注意事项
htmlspecialchars()
主要用于输出 HTML 内容时对用户输入的转义。如果你需要将用户输入作为 HTML 标记(比如<div>
)安全地显示,htmlspecialchars()
是首选。- 对于更复杂的场景,比如需要处理完整的 HTML 文档或需要转义所有 HTML 实体,可以使用
htmlentities()
函数。
总结
htmlspecialchars()
是防止 XSS 攻击的一个重要函数,通过将特殊字符转义,避免浏览器将其解释为 HTML 或 JavaScript 代码。- 它在输出用户输入的数据时尤其重要,比如在评论区、聊天框等地方。
xss之href输出
javascript:alert(1)//同样可以绕过
xss之js输出
输入
javascript:alert(1)
?message=javascript%3Aalert%281%29&submit=submit//Url中多了message参数
提示
随便输入看一下源码
尝试闭合
1'</script><script>alert(1)</script>
没有闭合,再试一次
1'</script><script>alert(1)</script>
成功弹窗