这两天突然看到 https://blog.ripstech.com/2020/sql-injection-impresscms/,想着复现一下,记录一下学习过程。

漏洞分析

漏洞复现

首先我们先下载安装一下这个 cms,然后直接访问:

http://127.0.0.1:81/admin.php/modules/system' and sleep(2) and '1

这个 url,会发现延迟了三秒,没错这个漏洞就是这么简单。更深的用法我们就不讨论了。

漏洞分析

打开 cms 的文件: \htdocs\libraries\icms\module\Handler.php,找到 service 函数:

static public function service($inAdmin = FALSE) {

if ($inAdmin || ... ) {

$url_arr = explode('/', strstr($_SERVER['PHP_SELF'], '/modules/'));

if (isset($url_arr[2])) {

//关键点

$module = icms::handler("icms_module")->getByDirname($url_arr[2], TRUE);

我们首先访问 admin.php 会执行到这个函数,然后 inAdmin 会设置成 true,到第四行获取了 PHP_SELF 并以 /modules/ 分割,然后讲 /modules/ 后的内容带入 getByDirname,跟进该函数:

public function getByDirname($dirname, $loadConfig = FALSE) {

if (!empty($this->_cachedModule[$dirname]) &&

$this->_cachedModule[$dirname]->getVar('dirname') == $dirname

) {

...

} else {

$sql = "SELECT * FROM " . $this->db->prefix('modules') . " WHERE dirname = '" . trim($dirname) . "'";

//执行sql

可以看到这里直接带入了 $sql 没有任何过滤。

扩展思考

之前我也审计到过一个此类的漏洞,这里顺便分享一下:

然后下面的代码:

//此处的 $uri 就是 PHP_SELF

$tmp = strtolower(substr($uri,-4));

if(in_array($tmp,array('.jpg','.gif','.png','jpeg')) && substr($uri,0,11) == 'res/_cache/'){

$tmp = substr($uri,11);

$tmp = explode("/",$tmp);

get_one($tmp[0]);

当文件名是 .jpg 结尾并且 uri 前十一位是 res/_cache/ 时进入,最后用 / 分割 uri 并带入 sql 语句。

很容易就可以 payload:

index.php/res/_cache/a'-sleep(3)-'/test/test.jpg

此外还有一个点,但是暂时没有见到过案例,比如:

print_r($_SERVER['REQUEST_URI']);

?>

这样的代码,然后我们用 bp 讲 /test/test.php 修改成:/abc'd/../test/test.php

当然,不管是 PHP_SELF 还是 REQUEST_URI 我们直接 echo 出来都会造成 反射的 XSS

实际上我们访问的依然是 test.php,但是 REQUEST_URI 输出的却是 /abc'd/../test/test.php。

当然,$_SERVER 里还有很多好玩的,期待师傅们挖掘出来教我QAQ

self php语法,PHP代码审计之关于PHP_SELF的简单利用相关推荐

  1. %3c?php else:?%3e,[红日安全]代码审计Day15 - $_SERVER['PHP_SELF']导致的防御失效问题

    本文由红日安全成员: DYBOY 编写,如有不当,还望斧正. 前言 大家好,我们是红日安全-代码审计小组.最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PH ...

  2. mysql怎样查表的模式_mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】...

    1.mysql简单的查询:select 字段1,字段2... from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都是 ...

  3. Lua基本语法-lua与C#的交互(相当简单详细的例子)

    lua脚本 与 C#的交互 本文提供全流程,中文翻译. Chinar坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Lua And C# - ...

  4. python 抽象语法树_用python演示一个简单的AST(抽象语法树)

    假设对'a + 3 * b'进行解释,其中a=2,b=5 代码很简单,就不再进行详细的解释了. Num = lambda env, n: n Var = lambda env, x: env[x] A ...

  5. mysql常用基础操作语法(四)--对数据的简单无条件查询及库和表查询【命令行模式】

    1.mysql简单的查询:select 字段1,字段2...  from tablename; 如果字段那里写一个*,代表查询所有的字段,等同于指定出所有的字段名,因此如果要查询所有字段的数据,一般都 ...

  6. 【代码审计】PHP文件包含漏洞利用总结

    0x01 概述 PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而导致意外的文件泄露甚至恶意的代码注入.涉及文件包含漏洞的四个函数如下: includ ...

  7. Java代码审计基础——RMI原理和反序列化利用链

    目录 (一)何为RMI (二). RMI的模式与交互过程 0x01 设计模式 0x02 交互过程 0x03  Stub和Skeleton (三)简单的 RMI Demo 1.Server 2.Regi ...

  8. PHP代码审计中你不知道的牛叉技术点

    一.前言 php代码审计如字面意思,对php源代码进行审查,理解代码的逻辑,发现其中的安全漏洞.如审计代码中是否存在sql注入,则检查代码中sql语句到数据库的传输 和调用过程. 入门php代码审计实 ...

  9. 布尔表达式的语法及语义分析程序_XSS语义分析的阶段性总结(一)

    作者:Kale 合天智汇 前言 由于X3Scan的研发已经有些进展了,所以对这一阶段的工作做一下总结!对于X3Scan的定位,我更加倾向于主动+被动的结合.主动的方面主要体现在可以主动抓取页面链接并发 ...

最新文章

  1. Mysql左连接分页查询
  2. python使用imbalanced-learn的RandomUnderSampler方法进行下采样处理数据不平衡问题
  3. Windows 之 win10快捷键
  4. 迷你MVVM框架 avalonjs 学习教程14、事件绑定
  5. 不包含本位置值的累乘数组
  6. 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数
  7. AIR720串口2收发数据问题
  8. 神话人物的现代版简历
  9. 电脑删除的文件怎么恢复?你要找的方案
  10. 小程序的 rpx布局问题
  11. Android 系统优化(33)---Android ART GC之GrowForUtilization的分析
  12. 程序员训练机器学习 SVM算法分享
  13. 1篇SCI二区+4篇一类可定A档博士!110万房补,享副教授甚至教授待遇!
  14. Shell(Bash)单引号、双引号、不加引号和反引号用法详解
  15. 404页面是什么意思?怎么正确设置?
  16. 激光雷达和毫米波雷达工作原理对比
  17. react 使用qs
  18. Pytorch的model.train() model.eval() torch.no_grad() 为什么测试的时候不调用loss.backward()计算梯度还要关闭梯度
  19. word2003如何设置护眼模式_在word中开启保护眼睛模式的详细教程
  20. vb.net如何查询电脑麦克风收到声音_远程会议痛点多?看Poly Studio X30如何破局

热门文章

  1. 详解CockroachDB事务处理系统
  2. 服务的协作:服务间的消息传递——《微服务设计》读书笔记
  3. C#各个版本中的新增特性详解
  4. Docker基础入门及示例
  5. 从工程转向管理,访谈Github公司的Phil Haack
  6. 【Microstation】三维建模基础及软件入门到精通实验教程目录
  7. LeetCode之Search Insert Position
  8. Android之如何看混淆后的错误日志代码
  9. realloc函数使用总结
  10. Github怎么删除之前的项目