目录
lesson 26 过滤空格,注释,and,or,/,\,-
lesson 27a union,select过滤大小写绕过
lesson 21 base64加密,单引号,cookie注入
从题目名称来看那么就很显而易见了,同样是cookie注入,不过有了base64的加密
同样的,先输入用户名和密码,admin和admin,然后用burpsuite抓包看一下
将这串代码复制到decoder中解密就是admin=,所以将%3D去除再加引号看看能否触发报错,YWRtaW4n即为admin' 的base64编码
通过上图报错信息我们可以得知语句的闭合方式为单引号和括号,那么就可以利用与20关相似的语句来继续实验了,只不过都得转换成base64编码的形式
同样的先判断列数,构造语句uname=admin') order by 4 #,并将等号后面全部用base64编码
经过判断得出共有三列,然后判断回显点uname=vegetable') union select 1,2,3 #,与上一关一样,输入数据库中没有的名字,让后面的union select语句得以执行
接下来的本来不想演示的,但是这是一篇新的文章,还是先搞一下好了,看一下当前数据库,直接将database()与任意一个数字替换即可,以2为例
然后查看security数据库中的表
然后查看users表中的字段
最后查值
OK,到这里就终于结束了,其实就是第一关的东西
lesson 22 base64加密,双引号,cookie注入
这一关和上衣管大同小异,只不过这一关不是单引号了,而是双引号了
因此,不在过多赘述
lesson 23 过滤注释符
加单引号即报错
但是无论如何无法成功,经过尝试,发现无法使用注释符将之后的代码注释掉,因此只能在加一个引号将之后的引号闭合
接下来的就大同小异了,不在浪费时间
lesson 24 二次注入
本关为二次排序注入,是一种存储型的注入,将能导致sql注入的语句先存到数据库中,然后在此调用时,就会触发sql注入
所以,我们需要构造一些特殊的用户名,然后在更新用户名时将语句闭合,从而成功做到免密修改密码,以admin为例,我们先注册一个账户,注册名为admin’ #,密码为123456
注册成功后我们去数据库看看
接下来,我们使用该账号进行登录,如图所示设置
修改完成后,去数据库查看,发现admin的密码被改为了刚才设置的密码,那么究竟是为什么呢?
因为我们刚才修改的并不是admin‘ #的密码,而是admin的密码,‘ 和 # 分别闭合和注释语句,从而完成了对admin密码的修改,看下面的语句,引号与之前的单引号闭合,而#注释掉了之后的引号
update users set password = '11111' where username = 'admin '# '
lesson 25 过滤or和and,单引号
本关过滤了or与and,比如我们输入order by会这样,直接将or去除了
那么试试双写会怎么样呢?不管怎么说,order算是回来了,好像有效
根据order by 3和4一个正常回显一个报错判断有三列
然后使用联合查询即可,遇到有or和and的地方双写即可绕过,查看回显位置
查看数据库中的表
然后查看users表中的字段名,在查值,与21关的语句大同小异
lesson 25a 过滤or和and,双引号
这一关和上一关没有什么差别了,只不过是换成了双引号闭合,把时间留到后面
lesson 26 过滤空格,注释,and,or,/,\,-
这该过滤的都过滤了,不知道怎么办才好,直接报错注入吧,简单粗暴
获取数据库名称
获取表名
?id=-1'||updatexml(1,concat(1,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema='security'))),0)||'1'='1''
获取字段
?id=-1'||updatexml(1,concat(1,(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_name='users'))),1)||'1'='1''
就这样吧,方法就是如此了
lesson 26a 多过滤,盲注
把这一关当作上一关来做的话,会发现没有报错信息,因此无法直接粗暴的使用报错注入
那么关键点就在于如何在注释符被过滤的情况下闭合语句
先添加单引号,页面出现异常,有报错信息,添加两个单引号 1' ' 页面正常,说明为字符型注入,确定是否有小括号,输入 )' '( 页面回显正常,说明小括号也是有的
然后通过编码和布尔盲注来解决这个问题,一想到盲注我就头疼,我暂且放弃这道题了······
lesson 27 union,select过滤大小写绕过
加单引号根据报错信息判断属于字符型注入,用单引号闭合
使用%0a代替空格,用大小写来绕过
?id=0'%0aUNion%0aSElect%0a1,2,3%0aand%0a'1'='1
接下来就是一样的了,将之前用过的语句复制过来往下走就ok了
lesson 27a union,select过滤大小写绕过
这一关就和上一关没什么区别了,只是闭合方式不一样
lesson 28 union,select过滤双写绕过
可以去看源代码,源代码union,select过滤并没有区分大小写,并且是将union select作为整体过滤,那就把他们当作整体双写好了
单引号括号闭合,用%0a替换空格就好,所用语句与之前差不多
lesson 28a union,select过滤双写绕过
这一关不需要绕过空格,同样双写union select绕过
lesson 29 单引号闭合绕过waf
世界上最好的防火墙?但是这一关用第一关的payload都可以做,为证清白,特意贴张图
去看看代码会发现,需要在···login.php?id=1这个url上操作
加单引号不行,被阻止了,这真防火啊···
但是可以···login.php?id=1&id=1' 来触发报错
那么就可以按照这个思路继续走下去了,这个利用的是http参数污染,输入多个同名参数,服务器仅取其中一个进行处理,在waf中仅对其中一个参数做了检测,另一个参数就正常处理了,再往后就是正常的联合查询注入了
lesson 30 双引号闭合绕过waf
按照攻克一关轻取三关的逻辑,这一关和上一关应该是一样的,测试发现猜想没错,这次只是换了双引号闭合方式
lesson 31 双引号括号闭合绕过waf
一起来看看这关又是什么牛马,按照前面的思路,先试探闭合方式才是紧要的
这还有什么好说的,谜底就在谜面上,双引号括号呗!没有问题哈
lesson 32 单引号宽字节注入
呕吼,新的挑战来喽
当我们加单引号时,页面好心的提示我们它在单引号前加了转义符号 \
这一关就是全新的内容了,也就是宽字节注入
服务器传入数据库的数据如果是宽字节,也就是类似GBK等编码时,可以加一个16进制字节,让其与转义符号 \ 组合形成一个不认识的汉字,从而绕过转义符
我们单独输入单引号,在前面加转义符是 \' ,也就是上图中的内容,而如果输入 %df ',在前面加转义符就是 \%df ' ,\%df 可以被编码为一个汉字,所以就变成了 字 ' ,也就是
\%df ' ————》 � '
所以我们试一下
之后在使用联合查询即可
···?id=1%df' union select 1,2,3--+
···?id=-1%df' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = database()--+
在这里,表名需要转换成16进制编码,否则会报错
···?id=-1%df' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 0x7573657273 --+
接下来的就是一样的了···
lesson 33 单引号宽字节注入
还记得那句话吗,一关过,过三关
这一关和上一关解法完全一样,没有差别
lesson 34 post宽字节注入
虽然他搞了个框,但还是掩盖不了他是宽字节的事实
借助burpsuite试探一下
然后就是一样的操作了
lesson 35 数字型宽字节注入
这一关就更简单了,数字型注入,只需要把表名列名等换成16进制就好了,与之前一样
lesson 36 单引号宽字节注入
这一关和32关一毛一样
lesson 37 post宽字节注入
这个···和34关一样,好了,宽字节全篇完
本篇内容也结束了