这篇文章,将教大家基本的手工sql注入和绕过waf的知识;分享一个实例,为了效果建议读者自己去搭建环境,因为真实环境都不怎么理想。

1. sql注入的基础

2. sql注入绕过waf

3. sql注入一个绕过实例

手工sql注入的基础

基础注入,盲注注入(时间和bool),报错注入,联合注入(union)

推荐sql-labs资源这个练习平台,推荐《mysql注入天书pdf》

1.base(基础的语句注入)

我们利用该表可以进行一次完整的注入。以下为一般的流程。

1)猜数据库

手工sql注入&&绕过waf &&一个实例分析_数据库

2)猜某库的数据表

手工sql注入&&绕过waf &&一个实例分析_数据库_02

3)猜某表的所有列

手工sql注入&&绕过waf &&一个实例分析_数据库_03

4)获取某列的内容

手工sql注入&&绕过waf &&一个实例分析_sql注入_04

2.union注入

union注入和基础的注入相差不大,只需将前面的数据置0,即没有那个指定字段即可;当然先要确定字段,下面的文章有分析

3. 时间注入

主要用到一些截断字符对数据库的字符进行判断

1)先试数据库的长度,当数字为6时发生了延时,说明数据库名共五个字符。

手工sql注入&&绕过waf &&一个实例分析_sql_05

2)开始猜数据库的字(当发生延时,说明当前数据库第一个字母为m):

手工sql注入&&绕过waf &&一个实例分析_数据库_06

3)其他的数据只需修改查询语句即可

4. bool注入

是根据回显,对的查询是一种回显,错的查询又是一种回显

也是字符截断函数来操作的

if(length(database())>8,1,sleep)

其他的不多说了

5. 报错注入

是通过报错函数来进行操作的

十种报错注入

作者常尝试的是这三个报错函数updatexml,exp,floor

手工sql注入&&绕过waf &&一个实例分析_数据库_07

sql注入绕过waf

ok,这是本篇的重点

作者就不填写那些网上普遍有的,给出几个记得到并且常用的,但是有些简单的还是要简单试下

1. 大小写混写

2. 编码试下  作者常用url编码;拿到数据库名和表名常用16进制替换他们的名字

3. 替换

and &&

or ||

相同函数的替换(这个先要过前面的引号闭合,字符过滤;前面的如果过不了,一般作者都考虑不到这,真要用到时才换)

4. 注释绕过

1)内联/*!50000*/,一般是被杀了的

2)/*!50000union/*!50000/*!(select*/~1,2,3)  (过安全狗写法,亲测可用,下面实际操作我们将这样操作)

3)句末注释://, -- , /**/, #, --+,--  -, ;--a

作者常用 -- -,屡试不爽(一般+是被过滤了的)

实际运用

手工操作一波,我的测试过程:

单引号走起

手工sql注入&&绕过waf &&一个实例分析_数据库_08

这种情况gpc一般是打开了

双引号,同样如此:

手工sql注入&&绕过waf &&一个实例分析_sql_09

ok,其实我们首先应该确定是字符型参数还是数字型

当id=2

手工sql注入&&绕过waf &&一个实例分析_sql注入_10

id=1+1

手工sql注入&&绕过waf &&一个实例分析_sql_11

这里+是被过滤了的,所以我们用-来做个运算

手工sql注入&&绕过waf &&一个实例分析_sql注入_12

一切正常

ok,说明是数字型的参数,那么就不用引号闭合,可以进行接下来的注入

(这里给大家补充一点小知识:cms审计时,这种id之类的都是inval函数处理的;其他的cms地方sql注入漏洞很有一些是因为数字型参数不需要引号闭合进行操作的)

如果是字符型的怎么办,字符型的gpc情况确实不好办,作者遇到的基本是编码绕过:这里的编码是gbk的编码,sprint函数这类的编码漏洞绕过;编码漏洞情况同样适合xss漏洞,都是绕过waf。

这里,作者是先进行常规注入,id=2 order by 2

手工sql注入&&绕过waf &&一个实例分析_sql_13

id=2 order by 1 正常

手工sql注入&&绕过waf &&一个实例分析_数据库_14

说明只能显示一列数据了

OK,我们进行union测试

手工sql注入&&绕过waf &&一个实例分析_数据库_15

发现了什么,union不见了

不急,我们有姿势

双写union(作者还真看到过只过滤一次关键词的代码)

手工sql注入&&绕过waf &&一个实例分析_sql注入_16

嗯,看来是过滤那个单词大小写(虽然过时了,现在匹配函数都直接大小通杀,不妨碍随手试下)

手工sql注入&&绕过waf &&一个实例分析_sql_17

看到UNIon被ban了

OK,不要着急,我们试下其他的方法

用过狗方法,这里就这样过了(普通内联试过无法)

手工sql注入&&绕过waf &&一个实例分析_sql注入_18

手工sql注入&&绕过waf &&一个实例分析_数据库_19

手工sql注入&&绕过waf &&一个实例分析_sql注入_20

 

手工sql注入&&绕过waf &&一个实例分析_sql注入_21

但美中不足的是网站的数据库系统配置出了问题,出现下面这个错误

作者这样尝试

手工sql注入&&绕过waf &&一个实例分析_sql_22

不指定库也是查找当前库;再尝试用limit0,1限制,效果也是如此

手工sql注入&&绕过waf &&一个实例分析_数据库_23

Illegal mix of collations for operation 'UNION'

遇到了这个问题,是数据库的编码不一样


ok,我们继续,作者直接or来取数据库

手工sql注入&&绕过waf &&一个实例分析_sql_24

被ban了

||  代替or

and呢(这比较有意思了,也是经常遇到了情况,waf特定情况才ban字符串,绕过本来就是经验和猜)

手工sql注入&&绕过waf &&一个实例分析_sql_25

我们看到,没有语法错误,是正确的,那我们取下数据库呢

手工sql注入&&绕过waf &&一个实例分析_数据库_26

按照mysql的语法,作者原先以为没有错(其实是错的语法)

手工sql注入&&绕过waf &&一个实例分析_sql注入_27

本地测试了下

手工sql注入&&绕过waf &&一个实例分析_sql_28

错误,再多语句,分号试了下,是对的

手工sql注入&&绕过waf &&一个实例分析_sql注入_29

想当然的给网址来了下分号(sqlmap中根据数据库的不同也有多语句测试)

手工sql注入&&绕过waf &&一个实例分析_sql_30

当然是错误的

时间注入嘛,测试成功(突破口哦)

手工sql注入&&绕过waf &&一个实例分析_sql注入_31

作者一开始这样测试

手工sql注入&&绕过waf &&一个实例分析_sql_32

嗯,忘记单引号被过滤

用mysql的其他函数来解决

手工sql注入&&绕过waf &&一个实例分析_sql_33

附上测试代码(sql时间盲注的代码除了sql的语句不同,其他的类似;bool盲注,就是修改返回判断条件,if “aaa” in res.content:,bool就没有去测试了,有兴趣自己试一下吧)

手工sql注入&&绕过waf &&一个实例分析_sql_34

报错注入试下:

手工sql注入&&绕过waf &&一个实例分析_sql注入_35

这么多报错函数,就没有一一去测试

总结

本篇文章较基础,但对于作者来说,较全面了

手工注入知识就这些,更高级的就是各种姿势了

大体也是这个流程,这也是作者的所有干货了

文章仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明!

手工sql注入&&绕过waf &&一个实例分析_数据库_36