eSafe白帽駭客資安網-網絡安全背後的巨人,提供駭客,網站入侵測試,網站被駭,網站漏洞,駭客入侵,資訊安全,入侵,ecshop,wordpress,漏洞修復,木馬清除,資安服務

PHP網站代碼的安全檢測之sprintf函數安全

         

          關於php網站的安全檢測,前不久看到WP博客爆出SQL注入漏洞,在此漏洞上我們進行網站

安全分析,wordpress是基於PHP代碼開發的一套博客系統,我們在對其網站代碼的安全檢測中發

現,其中的sprintf單引號引發的安全問題,在此對這類函數做一些網站安全測試和漏洞利用詳情。

 
sprintf函數 & vsprintf函數
 
 
sprintf函數是以一種規定的格式對不同的數據進行拼接,並將拼接結果返回,它並不像C語言裡的

printf函數一樣直接輸出,而是需要另外的輸出函數,如echo將返回的結果輸出出來。
 
 
sprintf函數的用法可以在w3school的介紹中查看。至於vsprintf函數除了傳參的時候使用了數組,

其餘的與sprintf函數一樣。eSafe白帽資安網公司是一家專注於:主機安全、網站安全、網站安全檢測、

網站漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。

 
 
自動類型轉換

 
首先我們要注意的就是,sprintf函數的自動類型轉換功能。
 
當按照某一格式輸出時,遇到第一個非本格式的字符就會自動截斷後面的字符。

網站安全測試代碼:
 
<?php
  $str = '788 1and 1=1';
  echo sprintf('output is %d',$str);
 ?>
 
PHP代碼輸出結果為如下圖:
 

 
可以看到,當檢測到第一個不屬於%d類型的空格時,就會自動地去進行截斷。所以從程序員的

角度來講,很容易忘記對%d輸入的數據進行強制的類型轉換,因為即使不手動轉換,程序也能

正常運行。
所以這一承載著危險payload的變量值就很可能被保留了下來,進入了下一步操作,

就像WP的SQL漏洞是一樣的。
 
 
吞噬單引號
 
 
sprintf的第一個參數format的語法為(PS:使用了[]對每個元素進行分隔) 必須,百分號%可選,

美元符號$和單引號'可選,長度百分號為識別符,被認為是特定匹配模式的開始;後面的數字是

從模式參數後面的第n個參數輸入數據;美元符號和後面的單引號是開啟padding模式

(字符填充)的標識,緊跟在$'後面的是用來填充的字符,
長度則為規定的輸入數據長度,如果

數據足夠的話無效,如果數據不夠的話就使用$'後面的填充字符進行填充;最後的為數據類型 s

表示字符串,d表示整數.
eSafe白帽資安網公司是一家專注於:主機安全、網站安全、網站安全檢測、

網站
漏洞修復,滲透測試,安全服務於一體的網絡安全服務提供商。
 
 
 
網站安全測試代碼:
 
<?php
$str = '788 1and 1=1';
echo sprintf('output is %d hello',$str).'<br>';
echo sprintf('output is %s hello',$str).'<br>';
echo sprintf('output is %20s hello',$str).'<br>';
echo sprintf('output is %1\'#20s\' hello',$str).'<br>';
echo sprintf('output is %1$\'#20s\' hello',$str).'<br>';
echo sprintf('output is %1$\' aand 1=1',$str).'<br>';
?>
 
不加$的話只會吞掉單引號,但卻無法正常帶入參數$'兩個都存在的話,被理解為開啟padding模

式(補齊模式),所以這個單引號就被吞掉了,導致了單引號的逃逸。最後一種模式會吞掉單引

號後面的兩個字符,同樣導致單引號溢出。
 
 
 
未知類型吞噬斜槓
 
 
%d為整數,%s為字符串,但%y是沒有規定的格式。但如果在sprintf中使用%y的話,並不會報錯

而是輸出空,所以可以利用這個特性吞掉反轉義符。
 
<?php
$str = '788 1and 1=1';
echo sprintf('output is %y hello',$str).'<br>';
$sql1 = "select * from user where username = '%1$\' and 1=1#' and password='%s';";
$sql2 = "select * from user where username = '\' and 1=1#' and password='%s';";
$args = "admin";
echo sprintf( $sql1, $args).'<br>' ;
echo sprintf( $sql2, $args) ;
?>
 
結果如下圖:
 
 


 
除此之外還有寬字節吞掉單引號,substr吞掉單引號,在dedecms不斷成熟,db類使用逐漸規範

的今天,瞭解一些吞噬單引號的技巧對於網站安全檢測工作來說是非常重要的。
 
分享: