bugku-Web-INSERT INTO注入(case注入技巧(逗号被过滤的延迟盲注)+延迟注入脚本)

本文介绍了在Bugku-Web平台中遇到的一种特殊注入情况,即INSERT INTO语句中的CASE语句注入。由于目标系统过滤了逗号,传统延时盲注的IF语句无法使用,转而采用CASE WHEN THEN结构进行注入。通过延时盲注确定了数据库长度为5,并逐步揭示了联合表名、列名及内容,最终获取到Flag:cdbf14c9551d5be5612f7bb5d2867853。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flag格式:flag{xxxxxxxxxxxx}
不如写个Python吧

error_reporting(0);

function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];

}

$host="localhost";
$user="";
$pass="";
$db="";

$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");

mysql_select_db($db) or die("Unable to select database");

$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);

很明显,ip由xff头或者Remote-addr得来,然后在insert into语句中对这个ip进行查询,我们可以把注入语句加到这个ip中来进行注入。

尝试了报错盲注,没有回显,也试了bool盲注,发现length(database())的值不管设成多少页面都不报错。

最后就剩延时盲注了,简单判断下库长

### 实现方法 为了在 MySQL 中将逗号分隔的字符串转换为多列,可以通过创建一个辅助表来帮助解析字符串。该辅助表用于生成一系列连续整数值,以便于通过 `SUBSTRING_INDEX` 函数提取每个子串并将其作为独立的一行或多列展示。 下面是一个具体的例子说明如何实现这一目标: #### 创建测试数据 假设有一个包含逗号分隔值的单个字段的数据集如下所示[^3]: ```sql CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, str VARCHAR(255) ); INSERT INTO test_table(str) VALUES ('a,b,c,d,e'); ``` #### 构建辅助查询 利用系统自带的帮助主题表 `mysql.help_topic` 或者其他具有递增 ID 的表来进行联合查询,从而达到分割目的。如果无法访问默认的帮助话题表,则可以选择任何合适的替代方案,比如构建自己的数字序列表[^4]。 这里给出基于 `help_topic` 表的方法: ```sql SELECT DISTINCT SUBSTRING_INDEX( SUBSTRING_INDEX(t.str, ',', h.help_topic_id), ',', -1 ) AS value FROM test_table t JOIN mysql.help_topic h ON h.help_topic_id <= LENGTH(t.str) - LENGTH(REPLACE(t.str, ',', '')) + 1; ``` 这段 SQL 查询会返回一个新的结果集,在其中原始字符串被拆解成了多个单独的记录,每一行代表原字符串中的一个元素。 对于希望得到的结果是以列为单位而不是以行为单位的情况,可以考虑调整上述逻辑,使得每次只选取固定数量的部分并将它们分配给不同的新列名下。然而需要意的是,这种方法通常适用于已知最大可能长度的情况下;否则可能会导致某些情况下缺少必要的输出列或存在多余的空置列[^5]。 例如,如果我们知道输入的最大项数不超过五项,那么可以直接指定五个新的列名称,并相应修改 SELECT 部分的内容: ```sql SELECT MAX(CASE WHEN pos = 1 THEN val END) col1, MAX(CASE WHEN pos = 2 THEN val END) col2, MAX(CASE WHEN pos = 3 THEN val END) col3, MAX(CASE WHEN pos = 4 THEN val END) col4, MAX(CASE WHEN pos = 5 THEN val END) col5 FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.str, ',', n.n), ',', -1) as val, n.n as pos FROM test_table t JOIN (SELECT @row := 0) r, (SELECT a.N + b.N * 10 + 1 n FROM (SELECT 0 N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a, (SELECT 0 N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b LIMIT 5 -- Adjust limit according to the maximum expected number of elements. ) n WHERE n.n <= LENGTH(t.str) - LENGTH(REPLACE(t.str, ',', '')) + 1 ) tmp GROUP BY tmp.val IS NOT NULL; ``` 此脚本首先计算出所有潜在的位置编号(pos),接着按照位置对各部分进行分类汇总,最终形成所需的多列结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值