国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

因str_replace導(dǎo)致的注入問題總結(jié)

2024-05-05 00:10:51
字體:
供稿:網(wǎng)友

研究了下replace的注入安全問題。

一般sql注入的過濾方式就是引用addslashes函數(shù)進行過濾。

str_replace,注入

他會把注入的單引號轉(zhuǎn)換成/',把雙引號轉(zhuǎn)換成/",反斜杠會轉(zhuǎn)換成//等

寫一段php代碼:

<!DOCTYPE html><html><head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head><body><?php $x=$_GET['x']; $id=str_replace(addslashes($_GET['y']),'',addslashes($x)); echo "過濾后:".addslashes($x)."<br/>"; echo "replace替換繞過:".$id."<br/>"; $conn = mysql_connect('127.0.0.1','root','root');//連接mysql數(shù)據(jù)庫  mysql_select_db('test',$conn);//選擇$conn連接請求下的test數(shù)據(jù)庫名  $sql = "select * from user1 where id='$id'";//定義sql語句并組合變量id  $result = mysql_query($sql);//執(zhí)行sql語句并返回給變量result  while($row = mysql_fetch_array($result)){//遍歷數(shù)組數(shù)據(jù)并顯示   echo "ID".$row['id']."</br>";   echo "用戶名".$row['name']."</br>";  }  mysql_close($conn);//關(guān)閉數(shù)據(jù)庫連接  echo "<hr>";  echo "當(dāng)前語句:";  echo $sql;?></body></html>

發(fā)現(xiàn)是引用了addslashes函數(shù)的:

str_replace,注入

一個單引號或者雙引號直接被轉(zhuǎn)義,字符串注入到這里基本上gg了。沒戲了。

  addslashes的問題:

    addslashes會把%00轉(zhuǎn)換成/0

    addslashes會把單引號(')轉(zhuǎn)換成/'

    因為使用了str_replace函數(shù),會替換那么輸入%00' 就被addslashes函數(shù)自動添加/0/',然后我們匹配0,就變成了//'再次轉(zhuǎn)換成/',單引號成功逃逸。  

<?php echo str_replace("0","","/0/'")?>

/0/'就是我們輸入的%00'

  會輸出:

str_replace,注入

那么知道了原理根據(jù)上面的php代碼構(gòu)造合適的sql語句繞過addslashes過濾

str_replace,注入

單引號成功逃逸,這里不能用單引號閉合了,后門閉合會被過濾那么直接:

  返回真:

str_replace,注入

返回假

str_replace,注入

那么想出數(shù)據(jù)就很方便。這里不演示了常規(guī)語句就行了。

模擬環(huán)境沒啥意思,去網(wǎng)上找了個別人的代碼審計文章,找到了一個雨牛挖的cmseasy的str_replace繞過注入的真實案例

  2014年的漏洞,cmseasy相關(guān)版本網(wǎng)上已經(jīng)找不到了,我改寫了個cmseasy,方便測試這個replace注入:

  cmseasy環(huán)境下載:鏈接: https://pan.baidu.com/s/1KgHaPxuB3UI36fyx4IbW9w 提取碼: 7aj3

  存在問題的目錄lib/plugins/pay/alipay.php

  第87行用了str_replace替換

str_replace,注入

替換后的內(nèi)容賦值給了$order_sn

  往下看發(fā)現(xiàn)調(diào)用了check_money函數(shù),跟蹤下這個函數(shù)查看內(nèi)部實現(xiàn):

  uploads/lib/table/pay.php

str_replace,注入

  先是賦值然后調(diào)用了getrow函數(shù),跟進去看看:

  uploads/lib/inc/table.php

str_replace,注入

  condition沒有啥數(shù)據(jù)庫操作后跟下面那個函數(shù),跟蹤下rec_select_one:

  還在table.php文件下:

str_replace,注入

  跟下sql_select函數(shù):

str_replace,注入

被帶入數(shù)據(jù)庫查詢:

  默認echo $sql;是被注釋的,解除注釋方便查看sql語句:

  因為str_replace的緣故,可以被繞過進行sql注入:

  去除注釋符,構(gòu)造poc:

  http://localhost/CmsEasy/uploads/index.php/?case=archive&act=respond&code=alipay&trade_status=WAIT_SELLER_SEND_GOODS

       POST:out_trade_no=11111%00'&subject=0

 sql語句報錯存在sql注入

str_replace,注入

那么修復(fù)方案是什么呢?

  回到剛開始的alipay.php

第79行

str_replace,注入

  正則匹配下/'

    然后再次訪問:

直接跳轉(zhuǎn)了不再停留了。 

str_replace,注入

修復(fù)方案:

function respond() {  if (!empty($_POST)) {   foreach($_POST as $key =>$data) {    if(preg_match('/(=|<|>|/')/', $data)){     return false;    }    $_GET[$key] = $data;   }  }

參考文章:https://wizardforcel.gitbooks.io/php-common-vulnerability/content/23.html

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到PHP教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 胶南市| 灵寿县| 讷河市| 奎屯市| 沅江市| 阿图什市| 上饶市| 浠水县| 稻城县| 东乡族自治县| 郧西县| 建瓯市| 平邑县| 额尔古纳市| 明光市| 三台县| 株洲县| 历史| 德化县| 姜堰市| 崇明县| 泗水县| 会理县| 安福县| 平塘县| 清水县| 桐柏县| 丁青县| 德令哈市| 泰州市| 北京市| 富民县| 吉安县| 新平| 赤壁市| 嘉义市| 郎溪县| 广元市| 白玉县| 原阳县| 绥化市|