🌕写在前面 🍊博客主页:Scorpio_m7,github🎉欢迎关注🔎点赞👍收藏⭐️留言📝
🌕写在前面
- 🍊博客主页:Scorpio_m7,github
- 🎉欢迎关注🔎点赞👍收藏⭐️留言📝
- 🌟本文由 Scorpio_m7原创,CSDN首发!
- 📆首发时间:🌹2023年2月10日🌹
- ✉️坚持和努力一定能换来诗与远方!
- 🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢感谢感谢!
大多数的漏洞主要是PHP的函数的使用不当造成的,只要找到这些使用不当的函数,就可以快速的发现想要挖掘的漏洞。
该方法主要是根据程序的业务逻辑和业务功能进行审计的。
通过对整个项目的代码进行阅读从而发现问题,这种方法是最全面的但也是最麻烦的。
总的来说一种是基于mvc(M:模型、V:视图、C:控制器)模型开发的程序,一种是普通面向过程的开发程序,针对不同的设计模式的系统我们应该采用不同的方法做审计。
用Fortify扫描后发现三个高危代码执行漏洞,针对最后一个漏洞,分析一下\public\class\Factory.class.php文件
static public function setModel() {$_a = self::getA();if (file_exists(ROOT_PATH.'/model/'.$_a.'Model.class.php')) eval('self::$_obj = new '.ucfirst($_a).'Model();');return self::$_obj;}static public function getA(){if(isset($_GET['a']) && !empty($_GET['a'])){return $_GET['a'];}return 'login';}
getA()方法接受a的参数,作为加载模型的文件名,如果该文件存在则执行eval函数实例化该模型。回溯查找setModel()方法,在\controller\Action.class.php中找到了,在加载Action类时会执行该类的构造函数,从而执行setModel()方法。
class Action {protected $_tpl = null;protected $_model = null;protected function __construct() {$this->_tpl = TPL::getInstance();$this->_model = Factory::setModel();Tool::setRequest(); //表单转义和html过滤}
在\Controller\ArticleAction.class.php中可以发现ArticleAction类继承了Action类,并调用了父类的构造方法,可以通过访问此类的方法并构造合适的payload去触发漏洞
//文章控制器class ArticleAction extends Action{private $_total='';public function __construct(){parent::__construct();$this->_sys=new SystemModel();$this->_model=new ArticleModel();}
一个个控制器找,找到了直接实例化SearchAction方法的类,这里明显调用了我们正好需要的方法,这样一来就可以访问到最开始的EVAL函数了。
//require str_replace('\\','/',substr(dirname(__FILE__),0,-7)).'/config/run.inc.php';define('ROOT_PATH',str_replace('\\','/',substr(dirname(__FILE__),0,-7))); require ROOT_PATH.'/config/config.inc.php';require ROOT_PATH.'/public/smarty/Smarty.class.php';//自动加载类function __autoload($_className){if(substr($_className,-6)=='Action'){require ROOT_PATH.'/controller/'.ucfirst($_className).'.class.php';}elseif(substr($_className, -5) == 'Model'){require ROOT_PATH.'/model/'.ucfirst($_className).'.class.php';}else{require ROOT_PATH.'/public/class/'.ucfirst($_className).'.class.php';}}$_tpl=TPL::getInstance();$_search=new SearchAction();$_search->index();?>
回到最开始的地方,首先要经过file_exists函数,再经过ucfirst函数,ucfirst函数是将首字母转换成大写。file_exists函数只要目录存在文件不存在结果也为真的
echo file_exists("f://test/../../");?>
最终Payload构造为:yccms/search/index.php?a=AdminModel();phpinfo();//../
,AdminModel();用来闭合前面的实例化,phpinfo();是我们要执行的代码,//用来注释后面的多余代码,…/用来返回上一级目录。
api目录
应用目录
门户应用目录
应用配置文件
模块函数文件
控制器目录
模型目录
应用公共(函数)文件
应用(公共)配置文件
数据库配置文件
路由配置文件
WEB 部署目录(对外访问目录)
api入口目录
插件目录
前后台主题目录
文件上传目录
入口文件
爬虫协议文件
快速测试文件
重写文件
CMF核心库目录
扩展类库目录
thinkphp目录
第三方类库目录(Composer)
当在后台【URL美化】功能中插入PHP代码保存后,重新访问该页面PHP代码会被执行,在public下创建11.php,导致产生代码执行漏洞。
尝试抓包,看看我们在保存设置到最后执行PHP代码之间经历了什么
一共提交了两个请求,第一个请求提交到admin目录下route控制器中的editpost方法
该方法是用来接收参数后更新到数据库。流程应该就是当某个URL地址被访问后,路由机制会从数据出中读取是否存在该URL的地址转发,如果有,则访问到相对应的路径。
第二个请求对route表中的数据排序后调用getRoutes方法
跟进getRoutes方法
最后构造payload:'.file_put_contents('1.php','').'
来源地址:https://blog.csdn.net/qq_45161658/article/details/128976429
--结束END--
本文标题: php代码审计
本文链接: https://lsjlt.com/news/387871.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0