今日、asrc (http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.96tpib&id=13 ) で cms の脆弱性分析に関する記事を見て、次のような気がしました。 Ali Daniel は、脆弱性分析を書くとき、ましてや利用方法を書くときはまだ少し慎重です。
この CMS を Baidu で検索しましたが、使用量は依然としてかなり多くなっています。 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 ではなく、単純な使用方法です。
out out out of Named: 1' Union select version() and '1'='1
次に、アップロードを送信すると、返される結果が表示されます。
さらに厄介な問題は、値が2つのSQLステートメントに格納されているため、2つのステートメントの列が異なるため、エラーが発生することです。ここで Union を使用するとレポートされます。唯一の方法はブラインド インジェクションです。または、他の場所で初期化されていない変数を探すこともできます。
サイズ: 55.3 KB
サイズ: 26.1 KB
添付画像を見る
上記では、関連する側面も含めて Qibo CMS の SQL インジェクションの脆弱性について学習しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。