可以看到如果以常规的exp进行测试是返回方法不存在的,因为原生路由被二次开发修改了,所以最终代码执行的payload如下
5.0.*和5.1.*
相对来说5.0可利用的exp比较5.1要多一些,5.1主要的利用方式还是上面举例用的exp
App.php出现问题的代码如下:
其实就是把反斜杠认定为类名,最终使得类实例化,具体的分析在这里就不拿出来水字数了。
而在渗透的过程中大的思路其实是差不多的,尝试多种exp,尝试读log文件等,
可以通过简单比对两个版本的目录结构在没有其他信息的情况下判断版本
TP5
TP5.1
如果网站不是以/public/作为根目录的话,又没通过报错直接体现版本的,可以通过访问目录看目录是否存在来做判断比如访问./thinkphp/,这里不推荐通过/app/目录来做判断,因为笔者遇到过很多开发者会修改这个目录,比方说改成/apps/,/applications/,也就无法准确判断是5.1还是5.0
tp3的渗透思路tp3 关于log文件相关的利用同上,目录一般为./Application/Runtime/logs/xxx/xx_xx_xx.log ,其中xxx为app名,文件名为年_月_日.log,如ApplicationRuntimeLogsHome_09_09.log
sql注入tp3的sql注入指的是框架层面的注入问题,即二次开发的时候如果调用了model内的find, delete, select方法的话,就可能出现注入问题。
对于白盒测试而言,只要model.class.php没修复然后找到调用了方法的地方就可以挖掘到注入。
以select方法简单做个分析
Model.class.php
函数可以接受一个options参数,为了构成注入肯定是要进入到_parseoptions方法,也就是要绕过两次判断,也就是只要传输的options为数组,同时主键不是数组,就能进到_parseOptions方法
可以看到传入options['table']或options['alias']且设置options['where']值为字符串,最终会options直接返回,整个过程是没有过滤的,
然后进到ThinkPHPLibrayThinkDbDiver.class.php,进到select方法
可以看到sql语句是最后的parseSql生成的。
跟进到parseWhere方法,只要绕过if,最终的return的sql语句是直接拼接的,也就是注入的产生原因,会直接带入select方法执行。
黑盒测试也比较类似,一般情况下找到数据库交互点后进行注入尝试即可。
cache写shellcache写webshell的难点在于cache文件名的确定,一般情况下是md5(绝对路径)生成的cache文件,上文也提到某些情况下可以通过log文件确定cache文件名称
cache文件写入的时候会被注释,所以需要通过%0d%0a提行绕过注释
所以最终的payload一般为
%0d%0aeval($_POST['cmd']);%0d%0a//找到参数影响页面的点后通过传参写入webshell,本地可以复现,实战中倒是没遇到过。
tp3渗透主要思路