------------------------------------ Rank 1 ---------------------------------------
先用 id=1 作为参数进行访问:
image.png再用 id=1' 判断是否存在注入:
image.png发现服务端会对单引号进行处理(在其前面添加反斜杠\进行转义),应该是用了 addslash() 这样的函数。
所以这里尝试使用宽字节注入进行测试,如果数据库用的是GBK编码,那就可以利用:
image.png image.png发现存在宽字节注入点,这样就好办了。
获取字段数:
image.png image.png获取当前数据库名:
image.png获取当前数据库下的表名:
( 注意,这里由于服务端对单引号使用了addslash()函数进行处理,所以注入的联合查询语句中也不能直接用 单引号,所以这里我用 hex编码来解决:0x7365637572697479 是 security的十六进制编码)
image.png获取zkaq表中的字段名:
0x7A6B6171 是 zkaq 的hex编码
获取zkaq表中zKaQ字段的内容,就能拿到flag。
------------------------------------ Rank 2 -------------------------------------------------
同 Rank1
------------------------------------ Rank 3 -------------------------------------------------
这道题,如果在username输入框处输入 1%df%27,提交后,如提示可知,sql语句直接变为了:
image.png那这里尝试直接使用中文字符来进行注入,输入:啊' and 1=1 #
提交后页面显示如下:
从图中看出,注入是成功的,这里要说两点:
(1) 为什么输入一个汉字加一个单引号就能成功呢,首先表单会以utf-8编码的方式提交后,而汉字在utf-8编码里是占3个字节的,然后经过addslash()函数的处理,添加了反斜杠后,就多了一个字节,再跟汉字后面的单引号一起就是5个字节,因为这里MySQL数据库是gbk编码,所以中间就会经历utf-8 到 gbk这样一个转换过程,而汉字在gbk编码中占两个字节,因此是每两个字节进行一次编码,因此最后的单引号就逃出来了。
(2) 这里不能使用 --+ 进行注释,在表单里,注释最好使用 # 或者 --后面加一个空格来代替加号+ 。
获取字段数,输入:
image.png啊' order by 3 #
输入:
image.png啊' order by 2 #
所以字段数为2。
获取当前数据库名,输入:
image.png啊' union select 1,database() #
获取当前数据库下的表名,输入:
image.png啊' union select 1,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 4,1 #
获取zkaq表的字段名,输入:
image.png啊' union select 1,column_name from information_schema.columns where table_name=0x7A6B6171 limit 1,1 #
获取flag,输入:
啊' union select 1,zKaQ from zkaq limit 0,1 #
其实Rank 3这道题还有一种方法,那就是用Burpsuite抓包,修改post的数据包,这样的话就可以使用%df%27这样的数据进行注入了。
网友评论