最近碰到一个MSSQL的注入,有一段时间没真正搞过注入了,就拿它找回一下手感。其实本身注入没什么特别的地方,就是带会话的SQL注入,有点简单的防护(用sqlmap秒之),然后就没然后了~~
之所以拿出来分享是后续考虑到脱库的效率性【本人只是秉着程序猿提高算法效率的思想去思考这个问题】
有注入,其实相当于一个数据库shell摆在你面前了,盲注应该不在这队列,要脱那就直接select了,但问题是通常网站只是显示一条数据,而非多条数据。如果是一个稍微大的库估计一条一条select都够呛。实际上是巨呛!!!对sqlmap,Pangolin,Havij估算了一下:
sqlmap:用dump一次只能拿到一条数据(普通dump,不知是否有其他高效的选项),快的话2条/s,假如一个100W的表,需要100 0000/2/3600 小时,各位感觉下
Pangolin:只能获得数据库,获得不了表名。而使用数据导出时未带有Cookie,结果导出失败
Havij:试了1.15和1.17版本,都未能获得数据库,没能绕过防护而失败告终
另想可以通过写个Python来搞定,POC通过抓sqlmap的包获得。其实说到底依然是访问一个URL,获得一条数据,添加多线程操作的话速度可能容易接收一点。
这其实有个小问题:MSSQL是没有Mysql的limit语句的,那如果通过准备定位获得某一行的数据呢?通过查找资料,提供一种解决方法:
select top 1 * from database.table where username not in (select top N * from database.table)
原理就是用where条件将top N行数据去除,再select
这种方法有个严重的问题:提交N多请求,容易在日志中被发现!!!
其实,说到脱库,最简单最快的方法就是将数据库备份到网站下进行下载最快。以前遇过一个站后台做了IP白名单,无法访问;shell也没有写/改/执行权限,没找到数据库连接字符串。
经过苦苦思考,最终用bcp搞定。
脱库是个体力活,真的