这篇文章,将教大家基本的手工sql注入和绕过waf的知识;分享一个实例,为了效果建议读者自己去搭建环境,因为真实环境都不怎么理想。
1. sql注入的基础
2. sql注入绕过waf
3. sql注入一个绕过实例
手工sql注入的基础
基础注入,盲注注入(时间和bool),报错注入,联合注入(union)
推荐sql-labs资源这个练习平台,推荐《mysql注入天书pdf》
1.base(基础的语句注入)
我们利用该表可以进行一次完整的注入。以下为一般的流程。
1)猜数据库
2)猜某库的数据表
3)猜某表的所有列
4)获取某列的内容
2.union注入
union注入和基础的注入相差不大,只需将前面的数据置0,即没有那个指定字段即可;当然先要确定字段,下面的文章有分析
3. 时间注入
主要用到一些截断字符对数据库的字符进行判断
1)先试数据库的长度,当数字为6时发生了延时,说明数据库名共五个字符。
2)开始猜数据库的字(当发生延时,说明当前数据库第一个字母为m):
3)其他的数据只需修改查询语句即可
4. bool注入
是根据回显,对的查询是一种回显,错的查询又是一种回显
也是字符截断函数来操作的
if(length(database())>8,1,sleep)
其他的不多说了
5. 报错注入
是通过报错函数来进行操作的
https://www.cnblogs.com/wocalieshenmegui/p/5917967.html 十种报错注入
作者常尝试的是这三个报错函数updatexml,exp,floor
sql注入绕过waf
ok,这是本篇的重点
作者就不填写那些网上普遍有的,给出几个记得到并且常用的,但是有些简单的还是要简单试下
1. 大小写混写
2. 编码试下 作者常用url编码;拿到数据库名和表名常用16进制替换他们的名字
3. 替换
and &&
or ||
相同函数的替换(这个先要过前面的引号闭合,字符过滤;前面的如果过不了,一般作者都考虑不到这,真要用到时才换)
4. 注释绕过
1)内联/*!50000*/,一般是被杀了的
2)/*!50000union/*!50000/*!(select*/~1,2,3) (过安全狗写法,亲测可用,下面实际操作我们将这样操作)
3)句末注释://, -- , /**/, #, --+,-- -, ;--a
作者常用 -- -,屡试不爽(一般+是被过滤了的)
实际运用
手工操作一波,我的测试过程:
单引号走起
这种情况gpc一般是打开了
双引号,同样如此:
ok,其实我们首先应该确定是字符型参数还是数字型
当id=2
id=1+1
这里+是被过滤了的,所以我们用-来做个运算
一切正常
ok,说明是数字型的参数,那么就不用引号闭合,可以进行接下来的注入
(这里给大家补充一点小知识:cms审计时,这种id之类的都是inval函数处理的;其他的cms地方sql注入漏洞很有一些是因为数字型参数不需要引号闭合进行操作的)
如果是字符型的怎么办,字符型的gpc情况确实不好办,作者遇到的基本是编码绕过:这里的编码是gbk的编码,sprint函数这类的编码漏洞绕过;编码漏洞情况同样适合xss漏洞,都是绕过waf。
这里,作者是先进行常规注入,id=2 order by 2
id=2 order by 1 正常
说明只能显示一列数据了
OK,我们进行union测试
发现了什么,union不见了
不急,我们有姿势
双写union(作者还真看到过只过滤一次关键词的代码)
嗯,看来是过滤那个单词大小写(虽然过时了,现在匹配函数都直接大小通杀,不妨碍随手试下)
看到UNIon被ban了
OK,不要着急,我们试下其他的方法
用过狗方法,这里就这样过了(普通内联试过无法)
但美中不足的是网站的数据库系统配置出了问题,出现下面这个错误
作者这样尝试
不指定库也是查找当前库;再尝试用limit0,1限制,效果也是如此
Illegal mix of collations for operation 'UNION'
遇到了这个问题,是数据库的编码不一样
原因参考:
https://www.cnblogs.com/google4y/p/3687901.html
ok,我们继续,作者直接or来取数据库
被ban了
|| 代替or
and呢(这比较有意思了,也是经常遇到了情况,waf特定情况才ban字符串,绕过本来就是经验和猜)
我们看到,没有语法错误,是正确的,那我们取下数据库呢
按照mysql的语法,作者原先以为没有错(其实是错的语法)
本地测试了下
错误,再多语句,分号试了下,是对的
想当然的给网址来了下分号(sqlmap中根据数据库的不同也有多语句测试)
当然是错误的
时间注入嘛,测试成功(突破口哦)
作者一开始这样测试
嗯,忘记单引号被过滤
用mysql的其他函数来解决
附上测试代码(sql时间盲注的代码除了sql的语句不同,其他的类似;bool盲注,就是修改返回判断条件,if “aaa” in res.content:,bool就没有去测试了,有兴趣自己试一下吧)
报错注入试下:
这么多报错函数,就没有一一去测试
总结
本篇文章较基础,但对于作者来说,较全面了
手工注入知识就这些,更高级的就是各种姿势了
大体也是这个流程,这也是作者的所有干货了
文章仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明!
别忘了投稿哦
大家有好的技术原创文章
欢迎投稿至邮箱:[email protected]
合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哦
有才能的你快来投稿吧!
了解投稿详情点击重金悬赏 | 合天原创投稿等你来!