作者:心灵
纯属分析,并不是漏洞,也可以叫漏洞。
程序文件不多,大致能和用户交换的就是:留言本和网址提交。2个都详细看了几次,按本小菜看来是没有使用可能性,但看完下列分析或许可能用到,现在只剩下后台可以找了。
“admin/index.php”必须经过这里才能使用里面的文件,所以从这里下手。经典对白,看代码。
index.php:
<?
require '../init.php';
if(empty($_GET['c']) || ($_GET['c']=='login' and (empty($_GET['a']) || $_GET['a']=='login')) || $_GET['c']=='securimage')
//看来只能运行login和securimage 2个 一个是登录 一个是验证码
{}
else
{
mod_auth::instance(); //看权限检测
session_write_close();
}
load_controller();
?> |
看文件,mod_auth:
$auth = mod_login::instance();
if(!$auth->is_login())
{
header("location: ./index.php?c=login");
}
//经测试这里不能用关闭脚本方法去绕过,因为还有别的地方验证。
!$auth 就是 instance 转过来,那段不用看了,没什么作用。
主要是 is_login,看下:
public function is_login()
{
$cookie = array_var($_COOKIE, AUTH_KEY . '_admin_auth');
//获取COOKIE头 注AUTH_KEY为114la
if (isset($cookie) and !empty($cookie))
//判定是否为空.....
{
$cookie_data = explode(':', base64_decode($cookie));
//重点 解密这段东西并变成数组 用;分开
if (count($cookie_data) == 3)
//如果有3组数据
{
$current_cookie_auth = $cookie_data [1];
if ($current_cookie_auth == $this->())
//get_user_agent 就是
//return md5(AUTH_KEY . '_' . $_SERVER ['HTTP_USER_AGENT']);
//AUTH_KEY 是114la 然后加个_ 再加浏览器版本 然后MD5加密 这里可以自己结构了
{
$current_cookie_username = $cookie_data [0];
$current_cookie_password = $cookie_data [2];
//看到没? 账号密码是保存在COOKIES里的
if (self::verify_login_in($cookie_data [0], $cookie_data [2]))
//下面就是 存在后给予管理员权限的代码 忽略不看了
//下面是 verify_login_in 检测代码
$password_md5 = md5($password);
$select = "select * from ylmf_admin_user where
`name`='$username' and `password`='$password_md5' ";
if (app_db::query($select))
//以上是自动登录代码 |
然后就是看 114la_admin_auth,是如何加密的:
看登录验证代码:
if (self::verify_login_in($username, $password))
//$username, $password是POST提交的 全宇宙的登录方式都基本这样
{
$auth_key = self::get_user_agent();
//上面解析了 //get_user_agent 就是
//return md5(AUTH_KEY . '_' . $_SERVER ['HTTP_USER_AGENT']);
//AUTH_KEY 是114la 不是随机生成的
$auth_password = $password;
$auth_username = $username;
//上面2个不用解析了
self::update_login($username);
//记录登录记录
$cookie_value = base64_encode($auth_username . ':' . $auth_key . ':' . $auth_password);
//重点...账号 + 114la +密码.....
$cookie_expire = time () + 3600; //20分钟
//这里没用的 不用理
$cook_pre = AUTH_KEY . '_admin_auth';
//cookies前缀
$_COOKIE[$cook_pre] = $cookie_value;
//这里也不需要理会
setcookie(AUTH_KEY . '_admin_auth', $cookie_value, $cookie_expire, PATH_COOKIE);
//写入COOKIE
return true;
} |
看来解密方式非常简单,就是“explode(':', base64_decode($cookie));”,这样既获得管理员明文账号密码。
怎么获得管理员的 COOKIES?就是提交网址功能!
在提交的主页里加一段获取 COOKIES,然后记录在文件的代码就行了,这里不多说,很简单(注意:不能跨域获取!)。
因为管理员必须要登录后台才能查看提交网址,所以必然只有管理员才看到你的网址并打开,并具有那个 ll4la_admin_auth 的 COOKIES。
99% 的人审核网站肯定会打开看一下,还有一个就是看都不看就通过……,就是白痴他祖先。
注:并不是利用 XSS 盗 COOKIES,因为这套程序暂时没发现 XSS 漏洞,因为能给你使用的只有留言本和提交网址。而是引导管理员打开你的 PHP 网站来获得需要的 COOKIES。
获取管理员 COOKIES 0DAY 就是社会工程学,因为提交网址收录的,必然管理员已经登录(具有条件了)才能看到,看到后必然打开你的网址才看下能否值得收录。
利用方式很明显了,这需要针对性!
PS:你的网站如何获得目标网站 COOKIES?这方法很多,跨域就难了,挂马总可以把?钓鱼可以把?
文章作者
Nuclear'Atk
上次更新
2011-01-21
许可协议
Nuclear'Atk(核攻击)网络安全实验室版权所有,转载请注明出处。