一种特殊的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&currentPage=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注入-个人理解的主要内容,如果未能解决你的问题,请参考以下文章

关于Spring的个人理解

SQL注入的基本原理

9月九日作业:对编译原理的个人理解

java使用单例与使用static方法的对于和个人理解

零基础从sqli-labs开始学SQL注入个人记录向

passwd中特殊权限s的个人理解