前言
问题发生在user.php的display函数,模版变量可控,导致注入,配合注入可达到远程代码执行
漏洞分析
0x01 SQL注入
先看user.php
$back_act变量来源于HTTP_REFERER,我们可控。
assign函数用于在模版变量里赋值
再看display函数
读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随意控制。
再看insert_mod函数
非常关键的一个地方,这里进行了动态调用
$val传入进来用|分割,参数传入进来时需要被序列化
再看include/lib_insert.php中的insert_ads函数
可以看到这里直接就能注入了
0x02 代码执行
继续看fetch函数
追踪_eval函数
$position_style变量来源于数据库中的查询结构
然后我们继续构造SQL注入,因为这段sql操作 order by部分换行了截断不了 所以需要在id处构造注释来配合num进行union查询
函数中有一个判断
我们 id传入’/*
num传入*/ union select 1,0x272f2a,3,4,5,6,7,8,9,10– -就能绕过了
var_dump一下
再看fetch函数,传入的参数被fetch_str函数处理了
追踪fetch_str函数,这里的字符串处理流程比较复杂
这一行意思是:
比如$source是xxxx{$asd}xxx,那么经过这行代码处理后就是返回this->select(‘$asd’)的结果!
再看select函数
第一个字符为$时进入$this->get_val函数
我们$val没有.$又进入make_var函数
最后这里引入单引号从变量中逃逸
我们要闭合_var所以最终payload是
会在网站跟目录生成1.txt 里面内容是Getshell