### 简要描述: 一个二次操作造成的任意文件写入。需要一定权限,自评为鸡肋。作为一个诚实的孩子,是怎样就怎样,我会把问题说的很清楚以避免误会哦~ ### 详细说明: 只拿整站做说明,下载最新版本。 /inc/function.inc.php 1507行 ``` //自定义内容页文件名缓存生成 function get_showhtmltype(){ global $db,$pre,$Fid_db; $query = $db->query("SELECT aid,htmlname FROM {$pre}article WHERE htmlname!=''"); while($rs = $db->fetch_array($query)){ $show.="\$showHtml_Type[bencandy][{$rs[aid]}]='$rs[htmlname]';\r\n"; } foreach( $Fid_db[iftable] AS $key=>$erp){ $query = $db->query("SELECT aid,htmlname FROM {$pre}article$erp WHERE htmlname!=''"); while($rs = $db->fetch_array($query)){ $show.="\$showHtml_Type[bencandy][{$rs[aid]}]='$rs[htmlname]';\r\n"; } } write_file(ROOT_PATH."data/showhtmltype.php","<?php\r\n".$show.'?>'); } ``` 一个生成什么页面的函数。我们看到,其中将htmlname从数据库中取出,直接放入$show.="\$showHtml_Type[bencandy][{$rs[aid]}]='$rs[htmlname]';\r\n";。那么htmlname只要闭合前面的引号(因为是二次操作,所以不需要考虑全局的addslashes),就能造成PHP代码最后写入ROOT_PATH."data/showhtmltype.php"文件。 我们看到这个函数在哪里调用: [<img...
### 简要描述: 一个二次操作造成的任意文件写入。需要一定权限,自评为鸡肋。作为一个诚实的孩子,是怎样就怎样,我会把问题说的很清楚以避免误会哦~ ### 详细说明: 只拿整站做说明,下载最新版本。 /inc/function.inc.php 1507行 ``` //自定义内容页文件名缓存生成 function get_showhtmltype(){ global $db,$pre,$Fid_db; $query = $db->query("SELECT aid,htmlname FROM {$pre}article WHERE htmlname!=''"); while($rs = $db->fetch_array($query)){ $show.="\$showHtml_Type[bencandy][{$rs[aid]}]='$rs[htmlname]';\r\n"; } foreach( $Fid_db[iftable] AS $key=>$erp){ $query = $db->query("SELECT aid,htmlname FROM {$pre}article$erp WHERE htmlname!=''"); while($rs = $db->fetch_array($query)){ $show.="\$showHtml_Type[bencandy][{$rs[aid]}]='$rs[htmlname]';\r\n"; } } write_file(ROOT_PATH."data/showhtmltype.php","<?php\r\n".$show.'?>'); } ``` 一个生成什么页面的函数。我们看到,其中将htmlname从数据库中取出,直接放入$show.="\$showHtml_Type[bencandy][{$rs[aid]}]='$rs[htmlname]';\r\n";。那么htmlname只要闭合前面的引号(因为是二次操作,所以不需要考虑全局的addslashes),就能造成PHP代码最后写入ROOT_PATH."data/showhtmltype.php"文件。 我们看到这个函数在哪里调用: [<img src="https://images.seebug.org/upload/201502/13235933ab4d720bb8ea059082cc246e6cd1deb3.png" alt="屏幕快照 2015-02-13 下午11.58.54.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201502/13235933ab4d720bb8ea059082cc246e6cd1deb3.png) [<img src="https://images.seebug.org/upload/201502/13235944d75fc3ed7f20d1b63bbb4b88dc4143be.png" alt="屏幕快照 2015-02-13 下午11.59.06.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201502/13235944d75fc3ed7f20d1b63bbb4b88dc4143be.png) 如上两图,实际上就是在增加文章、修改文章两个过程中调用的。 而默认情况下,注册用户是可以给“美女欣赏”这个栏目投稿,也就是增加文章的。但我们还需要一个权限,必须能“自定义内容页文件名”,需要后台给某些用户组开启这个权限: [<img src="https://images.seebug.org/upload/201502/140002509ca2ec3f40ba617949777ef42a7809d6.png" alt="屏幕快照 2015-02-13 下午11.30.20.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201502/140002509ca2ec3f40ba617949777ef42a7809d6.png) 具体操作方法见“漏洞证明” ### 漏洞证明: 首先我的用户组是有相关权限了。投稿给“美女欣赏”这个栏目。 我选择在修改文章的时候进行getshell。新投稿一篇文章,来到http://10.211.55.3/qibocms/member/post.php?job=edit&fid=10&aid=666,aid是我这篇文章的id。这里有“自定义文件名”: [<img src="https://images.seebug.org/upload/201502/14000809ef2559814cfff10f292d51680384424f.png" alt="屏幕快照 2015-02-14 上午12.07.30.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201502/14000809ef2559814cfff10f292d51680384424f.png) 如上图,在其他设置里,将自定义文件名用单引号闭合后,插入shell。需要以.html结尾。提交。 http://10.211.55.3/qibocms/data/showhtmltype.php可见已经getshell: [<img src="https://images.seebug.org/upload/201502/140011537d3d07cf1fc1ec54bfe7903f4f419748.png" alt="屏幕快照 2015-02-14 上午12.11.13.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201502/140011537d3d07cf1fc1ec54bfe7903f4f419748.png)