关于sql注入语句闭合的一些见解

学了那么久的注入,其实对于语句闭合我一直是懵逼的。以前看大佬的writeup都看不懂,不知道为什么要加单引号,为什么不要加,有时候为什么要双引号还有括号,为什么有and,为什么这样用的是or不是and。这些都十分影响了我的体验,这几天总算是勉强弄懂了一点了,所以打算应该写点什么。


一般的代码:$id=$_GET['id']

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; 

就是这里,对id进行了修饰,用'(单引号)把id括了起来。所以我们构造语句的时候,一是要把我们构造的语句‘逃逸’出来,二是要把结构进行补全或者适当的注释。

注释可以用--+;-- -;#把后面的'或者多余的修饰符注释掉,当然肯定不止这三种我只是举个例子而已。

一般常见的结构有以下几种:

or 1=1--+ 

'or 1=1--+ 

"or 1=1--+ 

)or 1=1--+ 

')or 1=1--+ 

") or 1=1--+ 

"))or 1=1--+ 

既把前面进行补全,后要保证格式的正确,让我们的语句可以顺利执行。



至于and和or的用法:

首先and是有假即假。我们先看一个例子 ?id=1' and 1=2 -- - ,很明显1是不等于2的,所以在?id=1是正确回显的情况下,例子一般情况下是不会给予正常回显的。

而or是有真即真,我们也来看一个例子 ?id=1' and 1=2 -- - ,和上面一样,1是不等于2的,而这个例子网页却可以正确回显。

通常情况下,or和and在注入的时候影响不算很大,两者区别一般在于盲注。很多时候防火墙拦截过滤了and的时候or可能没有,那就可以用or来进行盲注,节省绕过的时间。又或者用xor(异或)绕过防火墙,异或在这不作过多阐述,因为不在本次范围之内。


and和or的具体用法和不同还是要个人实际应用才能感觉到他们的不同作用。

第一次写这种类似科普的东西,如果哪里有错或者哪里说得不好的,欢迎大佬指正。

猜你喜欢

转载自blog.csdn.net/qiutyu/article/details/80314929