起因
- 最近不知道在搞什么,每周一堆目标发来让打,拿安服仔不当人。其中一个目标是用Jshop小程序商城程序,百度搜了一下有源码,就下载回来让大牛(@Joseph)带着一起审计了下。此处特别感谢Joseph、金枪银矛小霸王二位大佬相助。
程序简介
-
Jshop小程序商城,是一款开源的电商系统,包含微信小程序、支付宝小程序、APP、公众号、H5端、PC端、抖音小程序、今日头条小程序、皮皮虾小程序、西瓜视频小程序,前台使用uni-app开发,后台采用Thinkphp5.1框架开发。
项目地址:https://gitee.com/hnjihai/jshop_mall -
SQL注入
- 拼接导致的注入
- 文件位置:/application/api/controller/Goods.php
- 关键代码
public function getPickGoods()
{
.........省略部分代码
if (isset($postWhere['label_id']) && $postWhere['label_id']) {
$where[] = ['', 'exp', Db::raw('FIND_IN_SET(' . $postWhere['label_id'] . ',g.label_ids)')];
}
}
这里产生了拼接导致的注入,我们只需要看postwhere来自哪里
if (input('?param.where')) {
$postWhere = json_decode(input('param.where'), true);
//判断商品搜索,
if (isset($postWhere['search_name']) && $postWhere['search_name']) {
$where[] = ['g.name|g.bn|g.brief', 'LIKE', '%' . $postWhere['search_name'] . '%'];
}
if (isset($postWhere['bn']) && $postWhere['bn']) {
$where[] = ['g.bn', '=', $postWhere['bn']];
}
Post提交json_encode后的where参数再经过decode后赋值传给的postwhere
造成了getPickGoods功能where参数的注入
-
本地环境测试:
-
同位置getlist功能也存在注入
后台RCE
- 依旧是Goods.php
- 关键代码:
public function getGoodsParams()
{
$return_data = [
'status' => false,
'msg' => '无参数相关信息',
'data' => []
];
$goods_id = input('id/d', 0); //商品ID
$goodsModel = new GoodsModel();
$brandModel = new Brand();
$returnGoods = $goodsModel->getOne($goods_id, 'id,bn,name,brand_id,image_id,params,spes_desc');
if ($returnGoods['status']) {
$params = [];
$data = $returnGoods['data'];
if ($data['params']) {
$goodsParams = unserialize($data['params']);
$goodsParams = array_filter($goodsParams);
if ($goodsParams) {
foreach ($goodsParams as $key => $val) {
if (is_array($val)) {
$val = implode('、', $val);
$params[] = [
'name' => $key,
'value' => $val ? $val : ''
];
- 在添加商品 - 商品参数位置可触发反序列化
- 因为这俩注入对特么我的目标无效!所以后台RCE没有仔细研究!点一下就好了!有兴趣的大佬可以仔细看看,顺便带带我!
刚学怎么用Markdown,排版不好各位勿喷!