一种特殊的sql注入-个人理解

时间:2021-10-08 02:55:45

前言

工作中遇到某公司的web系统,其中的查询功能是存在注入的,但是却不能用sqlmap自动化的扫出;

post数据包参数格式:

  • &q@test.testo@lkt@string=&q@test.test_test@let@int=
  • &q@test.testo@eqt@string=test&q@test.test@lkt@string=&test=&page=1&rows=1
  • &$Q_test_test=&$Q_test_test=&xxx=&order= ASC &_query_code=0&pageMethod=
  • $Q_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,遇到=认为前面为参数,后面参数值)
  • 所以要添加,@int=&q@let@1=1 @int=&q@let@1=2
  • 变形后就是test=1 and 1=1 test=1 and 1=2 到这里就可以是用盲注了;
  • 至于添加or怎么添加:@int=&q@let@1=1 or 1=1 -》 test=1 and 1=1 or 1=1