这边继续带来一道有关于sql注入的题目,这道题目的提示是存在两个过滤,一个点名了是select,另一个需要自己去发现,贴上原题目
看到这个直接点明是sql注入中的GET方法,要传入一个id的值
第一步:判断注入类型,运用and 1=1 和and 1=2来判断
回显都为id=1的值的数据,由此判断这个注入类型是字符型注入
第二步:判断payload的闭合字符
第一种方法:运用转义字符\来查看闭合字符,原理是当闭合字符遇到转义字符时,会被转义,那么没有闭合符的语句就不完整了,就会报错,通过报错信息我们就可以推断出闭合符
这边可以看到\后有‘)',而我们所需要的就只有‘),因为最后一个’是这个服务器去添加的,用来跟前面的服务器语句去闭合用的,接着就需要在id=1后加上‘)进行闭合
第二种方法:继续通过注入id=1’和id=1‘’
(1)如果单引号报错,而双引号不报错
继续注入id=1' --+
无报错的话判断闭合符为:单引号闭合
报错的话判断闭合符可能为:单引号加括号
(2)如果单引号不报错,而双引号报错
继续注入id=1’‘ --+
无报错的话判断闭合符为:双引号闭合
报错的话判断闭合符可能为:双引号加括号
但是这道题目中经过多次尝试,应该是对--+和#进行了过滤,导致第二种方法不能够进行判断
不过也可以一个一个的去尝试,最终也能得出结果
例如:id=1’ or ‘1’=‘1 是判断单引号闭合 id=1’) or ('1')=('1 是判断单引号加括号闭合
其他的类型也可以进行类似的构造,这边不再一个一个举例了
第三步:查找注入点(这边的select运用的双写绕过过滤的方法)
由此得出111,222位置都是注入点,这道题目与第一道不同的是这个数据库的字段数已经给出来了,有三行的数据,所以就不用order by 函数去查找列数了
第四步:查找数据库名
由此得出库名是test
第五步:查找数据表名
得到两个表名,容易知道答案flag是在flag这个表中
第六步:获取flag
由此得到flag
拓展:
在写第一题的WP时将from语句放在了三个回显位的后面,所以导致在这道题目做的时候出现了一系列的原因,这边要注意这个from的语句要紧贴这个注入点的回显位,不然会导致出错
本道题目给我带来的启发还是比较大的,也是一个在成长的过程吧,希望各位大佬能够多多理解,有不严谨和错误的地方多多体谅,也欢迎指出来