Xss-labs-master 第10关

Xss-labs-master 第10关

关键点:

  • $_GET["t_sort"]:代表 URL GET 参数名字就是t_sort
  • PHP 接收 URL 上?t_sort=xxx这部分内容
  • 处理完直接塞进 input 的 value 属性里

而另一个参数keyword

php

运行

htmlspecialchars($str)

使用了 htmlspecialchars 转义,双引号、尖括号全部被编码,没法闭合,直接放弃。

2、为什么你会疑惑:页面上看不到输入框?

页面上只有一个搜索框,提交只携带 keyword; 但是代码里额外写死读取 GET [t_sort]

这个参数不在表单可见控件里,属于隐藏可控参数,浏览器访问时直接在 URL 拼接传参,不需要表单提交。

3、做题通用思路(以后遇到类似代码照这个流程)

  1. 逐行寻找$_GET[]/$_POST[],提取所有参数名 这里找到两个:keywordt_sort
  2. 看每个变量输出前做了什么过滤
    • keyword:htmlspecialchars → 基本不能利用
    • t_sort:只删除<>保留双引号 "→ 存在属性注入漏洞
  3. 看输出位置:<input value="可控内容" type="hidden">不需要<>新建标签,只用"闭合 value,追加事件属性。

4、延伸:实战中不知道源码怎么找这类隐藏参数?

如果没有源码,不能直接看见t_sort,渗透测试标准做法:

  1. 抓包观察表单提交参数
  2. 常见模糊测试字典爆破参数名:sort、t_sort、id、url、link、history……
  3. 观察页面隐藏 form 里 hidden 输入框的 name 值

html

预览

<input name="t_sort" ...>

页面右键查看网页源代码,就能看到 name="t_sort",猜测后端接收同名 GET 参数。

5、回到 Payload 原理顺带复习

payload:

plaintext

?t_sort="onfocus=alert(1) type="text autofocus

拼接结果:

html

预览

<input name="t_sort" value="" onfocus=alert(1) type="text autofocus" type="hidden">
  • "闭合原有 value
  • 新增 onfocus 事件
  • type="text"覆盖原 hidden,否则隐藏输入框无法触发焦点事件

一句话总结

不是我 “猜要加 t_sort”,是 PHP 源码明确写了:$_GET["t_sort"],后端只接收这个名字的参数。