sql注入学习笔记(1)--sqlmap参数介绍

前言

最近停更了一段时间,主要是重新学习了一下sqlmap
sqlmap真的是sql注入最好的工具,不管是linux还是window环境,都是最好的
可能sqlmap是终端命令模式,用起来体验可能没有上面某些软件好,但功能很完善,还是好好学习一下吧

sql注入

sql注入是个很老的漏洞,晚上对于这个的文章也很多.如果不了解的可以去看看手动注入的原理,不过学之前最好有一种数据库的使用基础,这样可能更好理解
虽然sql注入是个很老的漏洞,可能很多人认为现在人们不会犯这个错误了,但还是有很多地方还是有sql注入点,怎么寻找就要看你的google使用啦
比如说昨天我从google上看的一个点

comments.php?id=

还是可以找到的
废话不多说,下面正式开始

sqlmap介绍

sqlmap是kali里面自动集成的了,如果其他环境需要下载,可以直接去git上寻找项目
sqlmap一般是六种漏洞检测技术
基于bool,就是我们的and 1=1
基于错误
基于union联合查询
基于时间

' and (select * from (select(sleep(20)))a)--+

基于堆叠查询(一般比较少见,这对于环境有要求,有可能程序设计的原因导致堆叠查询无法正常进行)
基于内联查询
同时也支持很多的数据库管理系统(DBMS)
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,
Firebird, Sybase , SAP MaxDB,等等
但一般都是结构化数据库,非结构化数据库也存在sql注入,但就要利用另一个注入工具了

环境

学习的过程中,建议还是本地装个靶机,然后通过kali注入metasploitalbe2,
metasploitalbe2
提取码:u1l8

sqlmap的使用

输入

sqlmap -h

可以看到帮助
在这里插入图片描述输入

sqlmap -hh

会看到更详细的内容
在这里插入图片描述当然也比较推荐第二种方法
那么下面我们就从参数开始介绍啦
sqlmap参数是一类一类的,所以我们也按照类来进行介绍

基本的参数

-h         
 -hh                  
--version             版本号
-v VERBOSE            Verbosity level: 0-6 (default 1)
--update              更新

不过这个-v参数后面可以跟数字,就是显示信息的详细程度,数字越大显示的信息越详细,默认是1

Fingerprint指纹识别

这个下面的参数最少,就从他开始介绍

-f --fingerprint   查询数据库的版本指纹

-f和–fingerprint都可以,只不过是简写和全写的区别
这个参数和后面的有个参数有点类似,我们可以比较一下他们的区别

-b, --banner       检索数据库管理系统的版本

-f查询的结果

[INFO] actively fingerprinting MySQL
[08:45:26] [INFO] executing MySQL comment injection fingerprint
back-end DBMS: active fingerprint: MySQL >= 5.0.38 and < 5.1.2
               comment injection fingerprint: MySQL 5.0.51

-b查询的结果

[INFO] the back-end DBMS is MySQL
[08:47:15] [INFO] fetching banner
back-end DBMS: MySQL 5
[08:47:16] [INFO] fetching banner

可以看出-f的参数得到的结果远远比-b要详细,所以以后查询指纹可以不用-b了,就用-f即可

Target目标

Get方法提交注入

   -u  --url=   目标url地址,一定是包含注入点的url 
   sqlmap -u "http://192.168.0.11234/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" //加双引号是为了更好识别,因为有的url地址太长里面可能有\#这些特殊字符,所以引起来也方便一些
   sqlmap --url="http://192.168.0.113134/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"
  -l       从Burp或WebScarab代理日志文件解析目标

这里更多的是burp为例,比如说我们之后访问了很多站点,我们可以通过burp记载log,然后把burp的日志文件导入sqlmap进而解析日志里面出现的站点是否存在sql注入
打开burp,进入projetct-options,选择misc,找到logging,把proxy的request打勾并选择保存位置
在这里插入图片描述然后我们可以让浏览器开启代理,然后在proxy里关闭拦截,这样我们访问的记录就会被保存在日志里面,这里以1.log为例

sqlmap -l 1.log

然后就可以扫描日志里面的所有网页

--scope=       正则表达式过滤目标, 可以过滤日志内容,通过正则表达式匹配扫描目标
sqlmap -l 1.log --scope="(www)\.target\.(com|net|org)“
这个就限定了扫描的范围,就是target.com,target.net,target.org
-m        扫描文本文件中给定的多个目标

在这里插入图片描述编辑一个文本文件,保存为1.txt

sqlmap -m 1.txt

然后sqlmap就会自动识别里面的url然后并问你是否需要测试这个url
在这里插入图片描述

  -g       将谷歌结果处理为目标url

如果可以科学上网,这个选项是个不错的选择,这个是比我们在浏览器手动输入,然后手动判断再拿来扫描更好的,不过如果不可以科学上网,那就…只能跟我一样手动爬,跟goole类似的就是bing,我们可以把google的语法直接放在bing里面搜,这对于不可以科学上网的朋友是个福音

sqlmap -g "inurl:\".php?id=\""

中间加两个"是为了转义,避免和一头一尾的"闭合,里面的语句也是比较经典的搜sql注入点的语句

  -d          用于直接数据库连接的连接字符串

如果我们知道了对方的登录账号和密码,就可以通过-d的参数直接连接,也不需要再额外下个别的数据库组件了,其实这个就是通过直连的方式查询数据库的内容

sqlmap -d "mysql://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME"
sqlmap -d "mysql://USER:@DBMS_IP:DBMS_PORT/DATABASE_NAME" //密码为空的时候也要:
sqlmap -d "access://DATABASE_FILEPATH"

这样查询更快一些

通过post的方法

-r     从文件加载HTTP请求

这里还是要结合我们的burp
在这里插入图片描述捕获到http请求之后,全选然后选择copy to file,保存为1.txt

sqlmap -r 1.txt

Request请求

这些选项可用于指定如何连接到目标URL
修改request的头部

 -A  --user-agent    设置User-Agent的值 
 sqlmap -A "aaa"
 sqlmap --user-agent="aaa" 

因为sqlmap扫描的时候默认头是sqlmap/版本号,有的浏览器可能有拦截机制,所以我们可以修改头部为任意一个值,当然一般我们又记不住user-agent,所以我们可以通过

  --random-agent     使用随机选择的User-Agent
  sqlmap  --random-agent 
  (/usr/share/sqlmap/data/txt/user-agents.txt下面列有具体的user-agents的信息)

为什么要修改头,因为有时候sqlmap会报错

[ERROR] the target URL responded with an unknown HTTP 
status code, try to force the HTTP User-Agent header with option --useragent or --random-agent

这是浏览器的安全机制,所以需要我们伪造客户端请求
当然也可以把我们的sqlmap伪装成mobile

 --mobile            通过HTTP用户代理头模拟智能手机
 sqlmap --mobile

下面这三个不用多说

    --host=       HTTP主机报头
    --referer=    HTTP引用头
     --method=    强制使用给定的HTTP方法(如PUT),具体什么时候使用post我也还不是很清楚,慢慢练
-H   附加头 这个只能添加一个
--headers=   多个附加头(比如说 "Accept-Language: fr\nETag: 123")中间需要用\n来进行换行
 --data=DATA         通过POST发送的数据字符串
  --param-del=       用于分割参数值的字符(例如&),有时候可能参数之间使用的有其他的分割符,这个时候就需要我们自己手动指定
sqlmap -u "http://1.1.1.1/a.php" --data="q=foo;id=1" --param-del=";" 

身份认证部分
有时候web应用需要基于cookie的身份认证,那么就需要提供cookie信息

  --cookie=COOKIE     HTTP Cookie header value 
  sqlmap --cookie=""

有的cookie可能不标准,或者是专门这样设计,比如说

ID=176d4c35bcasdaasds9ce39b:T=159assaddd2358914

中间是通过:分割的,那么我们就需要利用cookie-del指定分割cookie的字符

sqlmap --cookie="ID=176d4c35bcasdaasds9ce39b:T=159assaddd2358914“ --cookie-del=":"
  --load-cookies=L.. 包含Netscape / wget格式的cookie的文件(这个应该就是之前那种标准的cookie)
  --drop-set-cookie  忽略响应中的Set-Cookie头(我也不是很清楚为什么要忽略这个)
--auth-type=  HTTP身份验证类型(Basic(基本)、 Digest(摘要)、NTLM(Windows NT LAN Manager )或PKI(公钥基础设施))
--auth-cred=  HTTP身份验证凭证(name:password)
--auth-file=AUTH..  HTTP认证PEM证书/私钥文件

就以basic(基于账号密码的来说)

sqlmap ....  --auth-type=Basic --auth-cred="root:password"

或者是pem证书的

sqlmap ...  --auth-file="ca.PEM"

*代理 *
比如说

sqlmap ....  --proxy="http://127.0.0.1:8080"  --proxy-cred="user:password"

当然也可以忽略代理

 --ignore-proxy      忽略系统默认代理设置,这个主要是扫描本地网络目标

当然也可以从文件导入代理链

 --proxy-file= 从文件加载代理列表

说到代理不得不提到tor

    --tor              使用Tor匿名网络
    --tor-port=   设置Tor代理端口以外的默认
    --tor-type=  设置Tor代理类型(HTTP, SOCKS4或SOCKS5(默认))
    --check-tor        检查Tor是否正确使用  

保护机制
因为检测和盲注会产生大量的失败请求,所以可以通过以下参数避免session被销毁

--safe-freq= 访问安全URL之间的定期请求,每发送 --safe-freq次注入请求之后就访问安全的url地址
--safe-url=  测试期间访问安全的URL地址,一般是不存在注入的url,避免session被销毁
--safe-req=  从文件加载安全的HTTP请求,跟之前的-r因为差不多
 --safe-post=  发送数据到一个安全的URL(只不过是使用post的方法)

这个的具体使用就是这样

sqlmap ... --safe-freq=4 --safe-url="http://target.com"

忽略

--ignore-code=  忽略(有问题的)HTTP错误代码(例如401)
--ignore-redirects  忽略重定向的尝试
--ignore-timeouts   忽略连接超时

杂项

 --delay=     每个HTTP请求之间的延迟()
--timeout=  超时连接之前等待的秒数(默认为30)
--retries=  连接超时重试(默认3)
--force-ssl        强制使用SSL/HTTPS,https站点
--skip-urlencode   跳过有效负载数据的URL编码 ,因为默认get方法会对传输内容进行编码,而有的网站不遵守编码标准,直接就使用原始字符
 --eval=     在请求之前执行提供的Python代码 (e.g."import hashlib;id2=hashlib.md5(id).hexdigest()")每次请求都会对id编码
--chunked         使用HTTP分块传输编码(POST)请求
--hpp               使用HTTP参数污染方法HTTP parameter pollution,绕过WAF/IPS/IDS的有效方法,尤其对ASP/IIS和ASP.NET/IIS
--randomize=   随机改变给定参数的值,(长度,类型保持一致)

csrf
绕过CSRF检测,这一块我不是很了解,也就不详细说了

--csrf-token=  用于保存反csrf令牌的参数
--csrf-url=  提取反csrf令牌访问的URL地址
--csrf-method=  在反csrf令牌页面访问期间使用的HTTP方法(get,post)

猜你喜欢

转载自blog.csdn.net/azraelxuemo/article/details/107085105