sqli-labs练习(less23-38)

Posted by kingkk on 2017-12-17

less-23

常规的单引号测试,出错 然后用#闭合,好像不行。。。编码一下。。好像也不行。。。试一下–+。。怎么还是不行。。。 查看源码之后发现,把注释符都改为空了,而不难发现之前的报错语句都是一样的 于是可以用 or ‘1’=’1闭合 这个没问题,可是好像获取不到数据。。于是得换一种注释方式(要提前测试字段数) 然后就可以开始提取数据了 还发现一种注入姿势,好像再多用一个单引号把后面引起来也可以,这样也可以执行 因为这里后面的语句是limit 0,1 对返回也没什么影响,所以是可以那么做

less-24

一个完整的登录、修改、创建用户的网站 还是去审计下代码把。发现过滤还是蛮严格的 最后,pass_change中貌似有一个参数可以利用 session和cookie不一样,它保存在服务器端,不能直接进行修改,但是没事,可以创建一个这样包含sql注入语句的用户名,先审查下注入语句 那应该注册一个admin’ #这样的用户名,先试试把,登录进入,然后改密码 看来思路没错

less-25

题目很明显地说明了过滤了or和and,从报错中也能看出来,这样的话,那大不了就不用呗 看了下别人的思路。。他们貌似是用or ‘1’=’1绕过的,那也就跟着学一手吧 开启了大小写匹配,那么大小写的话估计是绕不过了 第一种的话是利用算术运算符了

用&&的时候注意下要url编码 第二种方法就双写oorr,anandd,这种

less-25a

和上面一样,就是关了报错,而且没有引号引起来了 不过感觉没有报错,有点不是很清楚改怎么判断是双引号还是单引号还是没有引号这种了倒是

less-26

这里就有点酷炫 貌似是过滤了空格,然后试一下常用的替代空格的多行注释/**/貌似也不行。 无奈看了下源码,过滤了蛮多东西的还是 学着大佬写了个脚本尝试了下,什么字节能代替空格,脚本如下

#encoding=utf8
from time import time
import requests

url = ‘http://localhost/sqli-labs-master/Less-26/'

def to_hex(i):
h = hex(i)[2:]
if len(h)<2:
h = ‘0’+h
h = ‘%’+h
return h

def main():
for i in xrange(0,256):
url = “http://localhost/sqli-labs-master/Less-26/?id=1'union{0}select{0}1,2,3 ‘“.format(to_hex(i))
r = requests.get(url)
if ‘Dumb’ in r.text:
print to_hex(i)

if __name__ == ‘__main__‘:
main()

写脚本的时候出现过一个问题,就是不能将id参数通过params的方式传入,貌似会将其进行url编码,导致注入不了,只能直接跟在url的后面 跑出来就一个吧,那就用这个代替空格就好了

less-26a

和前面一个类似,就是闭合的方式不一样, 附上payload ?id=1') union%a0select%a01,2,3 || '1'=('1 这里貌似因为括号的原因,直接再多用一个引号的方式不行 对比下之前可以的语句

less-27

这里说明一下判断过滤什么符号的方式把,就直接把怀疑要过滤的符号放到可以执行的参数之前,如下 返回结果和只输入一个1时一样,就表示被过滤 这里就很惨了union、select都被过滤了,看了下源码 好像没有开启i大小写匹配模式,那就可以大小写混合绕过 不得不说这个%a0还是蛮好用的

less-27a

和之前好像差不多,payload: ?id=55"unIOn%a0selEct%a01,2,3 "

less-28

这里遇到一个问题,直接加引号注释的方式,在遇到括号的时候会这个样子 所以当两个引号能注释成功时,并不能判定有没有括号,果然自己发现的方法还是有些缺陷,用 or ‘1’=’1这种貌似就不会这样 附上上payload: ?id=55')union%a0select%a01,(select%a0password%a0from%a0users%a0limit%a00,1),(3)%a0or '1'=('1 (select与union之间要有空格,or前面也要有空格,反正不知道的话就多加几个好了)

less-28a

过滤了union select的组合,那就只能盲注入了 改一下less-7的脚本就行了 把id的值改一下即可"1' and ascii(substr(({2}),{1},1))>{0} and '1'='1".format(x,i,sql) 由于借鉴博客的那位大佬不更了,后面的都是自己写的,可能有点粗糙

less-29

不是很懂题目什么意思,好像直接绕过就行 payload: ?id=aa'union select 1,(select password from users limit 0,1),3 %23 后来发现,好像除了index.php,还多了hacked.php、login.php两个页面,不妨先进login看看 测试下单引号 貌似被waf拦了下来,而且跳转到了hacked.php页面,那就来分析下这个waf吧 $_SERVER[‘QUERY_STRING’]这个函数取得就是这一部分 然后传到java_implimentation这个函数里进行处理 单纯的切片操作,通过&将传入的参数分离,然后前两个值为id的然后将后面的内容返回 返回后交给whirelist函数处理 若不是纯数字,就跳转到hacked.php页面 这样的话java_implimentation这个函数对于参数的处理过于粗糙,就可以构造这样以一个payload: ?idd32&id=-1' union select 1,2,3 or '1'='1来绕过这个waf 只要前两个值为id,第三个之后纯数字即可

less-30

无waf的页面把29的单引号改成双引号即可 payload: ?id=aa"union select 1,(select password from users limit 0,1),3 %23 进login.php 和猜想的一样,也是改引号即可 payload: ?idd32&id=-1" union select 1,2,3 or '1'="1

less-31

测试了下双引号,然后报错 根据报错闭合括号就行 那么这样的话login.php也同理

less-32

加入单引号测试时,发现将单引号转义 查看下源码 其实自己看着也有点晕,反正意思就是说通过正则匹配,将单引号’ 双引号” 反斜杠\ 都在加一个反斜杠进行转义 \‘ \“ \\ 这样的话,试试宽字节注入 宽字节注入原理,就是通过unicode编码的原理,根据前两位的值判断接下来字节的大小,这样就可以将转义后的反斜杠\一并纳入字符中,使其消失转义的功能,通俗的说法就是吃掉一个反斜杠\ 报错了,那就表示有效,那就继续 附上payload: ?id=-1%df'union select 1,2,3%23

less-33

payload和之前的一样 看了下源码,其实这个过滤的方式和上一个差不多

less-34

利用宽字节在post里注入,原理其实都一样

less-35

测试一下,发现好像不需要引号,那就连宽字节都不用了?可能没懂出题人意思

less-36

好像和之前一样? 看了下源码,这里是通过mysql_real_escape_string这个函数过滤的 php官方手册对这个函数的解释是

mysql_real_escape_string() 调用mysql库的函数 mysql_real_escape_string, 在以下字符前添加反斜杠: \x00, \n, \r, __, _’_, _”_ 和 \x1a.

为了安全起见,在像MySQL传送查询前,必须调用这个函数(除了少数例外情况)。

但是这个函数依旧可以用宽字节吃掉转义的反斜杠

less-37

还是在post里面使用宽字节吃掉反斜杠

less-38

一样的意思 这里主要用了三个函数过滤 preg_replace(),addslashes(),mysql_real_escape_string() 都可以通过宽字节进行绕过,所以在写代码的时候光用这三个函数是远远不够的 不过宽字节貌似只有在gbk字符集下才能使用,所以在传入sql之前会进行字符集的指定 否则的话 依旧感谢 http://blog.csdn.net/u012763794/article/details/51457142