后台数据库渗透代码
一个下午,后台我盯着屏幕上的数据MySQL错误日志,第37次尝试注入失败。库渗目标是透代个老旧的电商后台,登录框连验证码都没有,后台可它的数据参数过滤却硬得像块铁板。我换了个思路,库渗把`id=1`改成`id=1 AND SLEEP(5)`,透代响应时间纹丝不动。后台又试了`id=1;SELECT IF(1=1,数据SLEEP(5),0)`,还是库渗秒回。这破站要么用了WAF,透代要么后端做了预处理语句。后台
数据库渗透代码的数据核心,从来不是库渗那些炫技的payload,而是对“数据如何流动”的直觉。你写一段代码,本质是在跟数据库的解析器玩心理游戏。比如经典的联合注入:
1' UNION SELECT username,password FROM users-- 这段代码看起来简单,但前提是你要知道目标表有且仅有两列能被前端页面回显。不知道?那就得靠`ORDER BY`盲猜。我习惯先丢一个`1' ORDER BY 3--`,如果页面报错,说明列数少于3;不报错就继续加数字,直到边界炸出来。
真正让我觉得“渗透代码”有意思的,是时间盲注。那次我遇到一个搜索接口,无论怎么注入都不回显任何数据,连错误提示都吞得干干净净。常规手段全废,只剩时间函数能当信使。我写了这么一段:
1' AND IF(SUBSTRING((SELECT database()),1,1)='a',SLEEP(3),0)-- 这段代码的意思很直白:如果当前数据库名的第一个字符是a,就让我等3秒。不是a,就立刻返回。靠着逐字符二分法,我花了四十分钟把库名抠了出来——`shop_2024`。那种感觉像在完全黑暗的房间里摸电灯开关,每摸到一次字母,就亮一下。
但别把渗透代码想得太神。多数时候你在跟时间赛跑,生产库的binlog每秒钟都在滚动,你多睡3秒,DBA的告警就可能弹出来。有一次我为了确认root账号的hash,用了`BENCHMARK(10000000,SHA1('test'))`,结果直接让目标CPU飙升到90%,防火墙立刻把我的IP封了。那次教训让我明白:能少用重型函数就别用,`SLEEP`比`BENCHMARK`温柔得多,至少不会把服务器搞宕机。
还有些渗透代码压根不碰SQL语法,专挑协议漏洞。比如PostgreSQL的`COPY FROM PROGRAM`,你只需要构造一条:
'; COPY cmd_exec FROM PROGRAM 'id'-- 这段代码能直接让数据库执行系统命令。听起来吓人,但前提是目标库的超级用户权限没被收走,而且你还得知道`cmd_exec`这个临时表存不存在。现实里大多数数据库管理员早把这些后门堵死了,你更多时候得翻`pg_hba.conf`的配置失误,或者找找有没有遗留的`dblink`扩展。
说句掏心窝的话,现在网上流传的“渗透代码大全”里,八成是过时玩意儿。真正的实战代码往往短得可怜,可能就几行,但每一行都踩在目标环境的特性上。比如SQLite的`json_extract`函数能绕过某些过滤,MySQL的`handler`语句能跳过`WHERE`限制直接读行,这些冷门知识比堆砌一堆`UNION SELECT`有用得多。
最后提醒一句:后台数据库渗透代码写出来是给人看的,不是给机器跑的。你得学会在代码里留注释——不是给管理员看,而是给几小时后的自己看。不然你打穿了三层防护,回头连自己当时为啥要用`GROUP_CONCAT`都忘了,那才叫真尴尬。

喜欢
讨厌