一切的故事都源自一条大晚上qq消息

我当时正在看一套.net程序然后这个逼大晚上找过来,想着直接睡觉不回的,怕我师傅第二天打我。
拿到源码直接拖进Sublime Text(很多人问代码审计应该用编辑器方便,只要你想,记事本都可以挖洞。)
审thinkphp,我喜欢先看版本然后方便快速定位漏洞
还有就是看TP的common.php这种类似文件,有无使用全局函数
protected function _get_where(){
$data = param_filter($_GET, array("mobile","realname","status","uid","start_create_time","end_create_time","card_id","status"));
$where = "1";
if(is_set($data, 'mobile')){
$where .= " AND mobile='".$data['mobile']."'";
}
if(is_set($data, 'realname')){
$where .= " AND realname like '%".$data['realname']."%'";
}
if(is_set($data, 'status')){
$where .= " AND status='".$data['status']."'";
}
if(is_set($data, 'uid')){
$where .= " AND uid='".$data['uid']."'";
}
if(is_set($data,'start_create_time')){
$where .= " AND create_time>='".$data['start_create_time']."'";
}else{
$it = time()-30*6*24*60*60;
$times = date("Y-m-d H:i:s",$it);
$where .= " AND create_time>='".$times."'";
}
通过全局GET获取内容经过param_filter函数
function param_filter($param,$allow,$must=NULL,$filter=false,$notnull=false){
if(empty($param)) return false;
$newAllow = $newMust = array();
$param = (array)$param;
//判断必须参数
if(!empty($must)){
foreach ($must as $k){
if(!isset($param[$k])) {//没有字段就返回
return false;//缺少必须字段
} else {
$newMust[$k] = trim($param[$k]);//符合要求放在新数组,过滤空格
if($filter){
//$newMust[$k] = htmlspecialchars($newMust[$k]);
}
if($notnull){
if($newMust[$k] == ""){
return false;
}
}
}
}
}
// 过滤无效参数
if(!empty($allow)){
foreach($allow as $k) {
if(isset($param[$k])) {
//符合要求的字段放在新数组
$newAllow[$k] = trim($param[$k]);//过滤空格
if($filter){
$newAllow[$k] = htmlspecialchars($newAllow[$k]);
}
}
}
//请求参数全部都不是允许的字段返回false
if(empty($newAllow)){
return false;
}
}
//整合返回数组,相同字段会覆盖
return $allow = array_merge($newAllow, $newMust);
}
遍历获取指定key的内容,期间未使用任何安全函数之类所以这里可以注入
nms
public function iupload($type="qrcode"){
$upload = new \Think\Upload();
$upload->rootPath = "/";
$upload->savePath = "/upload/".$type."/";
$filrInfo = $upload->upload();
if($filrInfo == false){
$this -> error = $upload -> getError();
}
return $filrInfo;
}
在base内发现了一处上传,跟进upload看看有没针对

发现有针对后缀的白名单处理,瞬间就不美丽。想着TP如何快速getshell

TP很喜欢在Runtime里面缓存模版或者数据缓存之类的。快速函数定位寻找可控点
public function __construct() {
$this->_getConfig();//获取配置文件
//读取模板id并缓存
//TODO
$tmpl = S("TMPL");
if(empty($tmpl) || 1){
$tmpl = $this->_getTmpId();//获取模板id
S("TMPL",$tmpl);
}
$this->tmpl = $tmpl;
在base文件发现有从数据库取tmpl内容然后缓存写入,都2020年了,很多都支持pdo。直接让他去操作了