手工注入

凌晨两点,手工注入我盯着屏幕上那个报错的手工注入登录框,咖啡已经凉透了。手工注入这不是手工注入什么高深的目标,就是手工注入一个普通的教务系统,但密码找回功能显然没做对——它直接把重置链接发到了响应包里。手工注入

手工注入这事儿,手工注入说白了就是手工注入跟数据库玩猜谜。你不需要什么炫酷的手工注入自动化工具,就一个浏览器,手工注入加上开发者工具里那几行代码,手工注入足够让一个不设防的手工注入网站把家底抖搂干净。我见过太多人一上来就掏sqlmap,手工注入噼里啪啦跑一堆参数,手工注入最后输出一堆看不懂的手工注入报错。那叫什么?那叫瞎猫碰死耗子。

真正的老手会先拿单引号试探。在用户名框里敲个',提交,看页面反应。如果弹了个数据库错误,恭喜,这扇门没锁。然后你开始数列数,用order by慢慢加,加到报错为止——这过程像开保险柜,得听手感。有时候你试到第7列才听到那声清脆的“咔哒”,心里那个爽,比中了彩票还实在。

有个细节特有意思。很多开发者在写查询语句时,喜欢用双引号包字符串,但数据库标准是单引号。你输入一个双引号进去,系统不报错,但查询结果会变得诡异——比如你搜“admin”,结果把“administrator”也带出来了。这种非标准写法留下的痕迹,就是手工注入最爱的突破口。你得学会从这些蛛丝马迹里反推后端代码的逻辑,像侦探从烟头推断凶手习惯一样。

拿联合查询举例。等确认了列数,下一步就是找显示位。把id改成-1,让正常查询返回空,然后拼上union select 1,2,3。页面上哪个位置蹦出了数字,哪个位置就能塞进你要的数据。这个过程我做过不下百次,每次看到那串数字像变魔术一样出现在不该出现的位置,还是会起鸡皮疙瘩。数据库里的表名、字段名,全在这些数字背后藏着,就等你用information_schema去翻。

最考验耐心的是盲注。页面不报错,也不显示数据,只有“登录成功”和“登录失败”两种反应。你得拿substr()配合ascii()逐字符猜,一个字段名猜下来,可能要发几百个请求。有人嫌烦,写脚本跑,但那不叫手工了。手工的乐趣就在这个过程里——你每猜对一个字符,就像在黑暗中摸到一块拼图,直到最后拼出完整的管理员密码哈希,那种成就感,自动化工具给不了你。

我有个习惯,注入前先看网站的响应头,服务器版本、脚本语言、数据库类型,全写在里面。有一次碰上个用老版本PHP的站点,直接就能用into outfile写webshell,连绕WAF都省了。但多数时候没那么好运,你得结合报错信息里的函数名,推断出数据库是MySQL还是Oracle,然后选对应的注入语法。Oracle没有limit,用rownum;MSSQL得用top——这些差异,教科书上写得再清楚,不如你亲手试错一次记得牢。

写到这儿,凌晨三点了。那个教务系统我最后没拿shell,只拖出了库里的表结构,证明漏洞存在就收手了。手工注入教会我的,不是怎么黑进别人系统,而是怎么理解代码背后的逻辑漏洞。每个参数都可能是入口,每个输入框都藏着惊喜。你得带着好奇心去试,像拆盲盒一样对待每个请求——但记住,拆开之后,要记得把盒子放回原处。