关键点:
$_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、做题通用思路(以后遇到类似代码照这个流程)
- 逐行寻找
$_GET[]/$_POST[],提取所有参数名 这里找到两个:keyword、t_sort - 看每个变量输出前做了什么过滤
- keyword:htmlspecialchars → 基本不能利用
- t_sort:只删除
<和>,保留双引号 "→ 存在属性注入漏洞
- 看输出位置:
<input value="可控内容" type="hidden">不需要<>新建标签,只用"闭合 value,追加事件属性。
4、延伸:实战中不知道源码怎么找这类隐藏参数?
如果没有源码,不能直接看见t_sort,渗透测试标准做法:
- 抓包观察表单提交参数
- 常见模糊测试字典爆破参数名:sort、t_sort、id、url、link、history……
- 观察页面隐藏 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"],后端只接收这个名字的参数。