一种特殊的sql注入-个人理解
Posted p0laris
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一种特殊的sql注入-个人理解相关的知识,希望对你有一定的参考价值。
前言
工作中遇到某公司的web系统,其中的查询功能是存在注入的,但是却不能用sqlmap自动化的扫出;
post数据包参数格式:
- &q%40test.testo%40lkt%40string=&q%40test.test_test%40let%40int=
- &q%40test.testo%40eqt%40string=test&q%40test.test%40lkt%40string=&test=&page=1&rows=1
- &%24Q_test_test=&%24Q_test_test=&xxx=&order=+ASC+&_query_code=0&pageMethod=
- %24Q_test=&orderCol=&order=+ASC+&query_code=0&test=test&rowCount=10000¤tPage=21
该系统查询的参数类似上面的格式:
- 这里面每个参数都是不存在注入的,虽然可控
但是系统是存在注入的,已经存在的参数是不能注入的,我们可以添加参数进行注入,例如:
- .php?id=1 我们在测试的时候会进行变形 .php?id=1 and 1=1 或者.php?id=1 and 1=2 或者 .php?id=1 or 1=1
- 现在重新理解一下这几个测试语句的意思,我们知道添加and 1=1和1=2如果页面输出不一样,就说明极大的可能存在注入,这时候我们通常会直接进行查询类的注入union
- 换一个思路想,条件为真,页面不变,条件为假,页面无数据,如果我们进行这样的判断 .php?id=1 and [假设我们不知道这里的参数,但是a-e中的一个]=[a,b,c,d,e] ,结果必然是只有一次尝试页面是正常的,我们就可以判断出是哪个字母
- 为什么这里可以用sqlmap扫出来,而我遇到的不行,我们遇到的大部分查询都是类似这样的,select * from xxx where xxx=xxx and xxx=xxx , 其中的参数的and是不会自动添加的,sqlmap就会对参数进行一一的尝试,类似=1 and 1=1 , 的过程,但是上面的数据包格式中貌似是会自动添加参数的,而且还有一定的格式
- 我使用第一个举例子:
- 转换为sql语句: select * from xxx where test.test=test(字符串类型) and test.test_test=1(整数型)
- 如果添加payload为:test=1 and 1=1 一定会报错(我的理解就是系统会找&和=符号进行分割,遇到&添加and,遇到=认为前面为参数,后面参数值)
- 所以要添加,%40int=&q%40let%401=1 %40int=&q%40let%401=2
- 变形后就是test=1 and 1=1 test=1 and 1=2 到这里就可以是用盲注了;
- 至于添加or怎么添加:%40int=&q%40let%401%3d1%20or%201=1 -》 test=1 and 1=1 or 1=1
以上是关于一种特殊的sql注入-个人理解的主要内容,如果未能解决你的问题,请参考以下文章