U盤精靈
導航: U盤精靈 > U盤資訊
相關欄目: U盤資訊 標簽 U盤測評 U盤安全

格式化,也就是被當作一個類型進行匹配后面的變量 深入解析sprintf格式化字符串漏洞

發布時間: 2020-03-29 10:19

0x01 sprintf()講解

首先我們先了解sprintf()函數

sprintf() 函數把格式化的字符串寫入變量中。

sprintf(format,arg1,arg2,arg++)

arg1、arg2、++ 參數將被插入到主字符串中的百分號(%)符號處。該函數是逐步執行的。在第一個 % 符號處,插入 arg1,在第二個 % 符號處,插入 arg2,依此類推。

注釋:如果 % 符號多于 arg 參數,則您必須使用占位符。占位符位于 % 符號之后,由數字和 "\$" 組成。

通過幾個例子回顧一下sprintf

例子1:

輸出結果:

帶有兩位小數:123.00

不帶小數:123

例子2:

輸出結果:

%b = 111010110111100110100010101

%c = 2 //注意var_dump('2')為string

%s = 123456789

%x = 75bcd15

%X = 75BCD15

0x02 sprintf注入原理

底層代碼實現

我們來看一下sprintf()的底層實現方法

switch (format[inpos]) {

case 's': {

zend_string *t;

zend_string *str = zval_get_tmp_string(tmp, &t);

php_sprintf_appendstring(&result, &outpos,ZSTR_VAL(str),width, precision, padding,alignment,ZSTR_LEN(str),0, expprec, 0);

zend_tmp_string_release(t);

break;

}

case 'd':

php_sprintf_appendint(&result, &outpos,

zval_get_long(tmp),

width, padding, alignment,

always_sign);

break;

case 'u':

php_sprintf_appenduint(&result, &outpos,

zval_get_long(tmp),

width, padding, alignment);

break;

case 'g':

case 'G':

case 'e':

case 'E':

case 'f':

case 'F':

php_sprintf_appenddouble(&result, &outpos,

zval_get_double(tmp),

width, padding, alignment,

precision, adjusting,

format[inpos], always_sign

);

break;

case 'c':

php_sprintf_appendchar(&result, &outpos,

(char) zval_get_long(tmp));

break;

case 'o':

php_sprintf_append2n(&result, &outpos,

zval_get_long(tmp),

width, padding, alignment, 3,

hexchars, expprec);

break;

case 'x':

php_sprintf_append2n(&result, &outpos,

zval_get_long(tmp),

width, padding, alignment, 4,

hexchars, expprec);

break;

case 'X':

php_sprintf_append2n(&result, &outpos,

zval_get_long(tmp),

width, padding, alignment, 4,

HEXCHARS, expprec);

break;

case 'b':

php_sprintf_append2n(&result, &outpos,

zval_get_long(tmp),

width, padding, alignment, 1,

hexchars, expprec);

break;

case '%':

php_sprintf_appendchar(&result, &outpos, '%');

break;

default:

break;

}

可以看到, php源碼中只對15種類型做了匹配, 其他字符類型都直接break了,php未做任何處理,直接跳過,所以導致了這個問題:沒做字符類型檢測的最大危害就是它可以吃掉一個轉義符, 如果%后面出現一個,那么php會把\當作一個格式化字符的類型而吃掉, 最后%\(或%1$\)被替換為空

因此sprintf注入,或者說php格式化字符串注入的原理為: 要明白%后的一個字符(除了%,%上面表格已經給出了)都會被當作字符型類型而被吃掉,,比如%c匹配asciii碼,%d匹配整數,如果不在定義的也會匹配,匹配空,比如%\,這樣我們的目的只有一個,使得單引號逃逸,也就是能夠起到閉合的作用。

這里我們舉兩個例子

NO.1

不使用占位符號


本文關鍵詞:格式化

最新推薦

我要分享到:
  • 殺毒 u盤寫保護怎么辦

    日本变态强奷在线播放5000[2018-12-05]隨著電腦使用時間越來越久,就會產生很多的垃圾和臨時文件,而這些文件都是存放在c盤中,久而久之就會影響系統的運行速度,所以我們很有必要對C盤進行清理,不過大家是否...

  • u盤啟動軟件

    [2020-03-24]2、打開小白軟件,將大于8G的U盤連接此電腦,點擊制作系統>>點擊開始制作。3、選擇...可以點擊快捷鍵大全,查詢ThinkPad電腦的U盤啟動熱鍵...

  • 殺毒u盤的優勢

    [2019-09-03]U盤出現問題了,格式化了一下,然后就顯示“請將磁盤插入驅動器”并且不能格式化。才剛用幾個月,丟掉太可惜了,于是查了一下資料,找到了一下工...

  • u盤殺毒后文件丟失了怎么辦/如何制作一個自動運

    日本变态强奷在线播放5000[2018-05-08]想給U盤分成幾個分區?看我的~!話不多說,直入主題:1、把U盤資料備份一下先~!(因為分區會刪除U盤上的所有數據哦)2、下載diskgenius這個分區管理工具...

  • win7系統下連接VPN提示錯誤800的原因分析以及應對

    [2018-05-16]微軟不斷的推出win10預覽版版本,也越來越多用戶去安裝體驗,在安裝過程中不少用戶反饋微軟怎么會強迫用戶去使用微軟賬號登陸呢?怎么就沒有給用戶選擇創建新的本地賬...

  • u盤運行的殺毒

    日本变态强奷在线播放5000[2019-08-01]1.開始---控制面板---管理工具---系統配置----引導----高級選項----處理器數----2(單核的朋友不要改這里),再勾選最大內存----確定--...

  • 新一代iPad曝光科技早報:長的太銷魂,

    日本变态强奷在线播放5000[2020-01-07]看點一:一款名叫Virtuali-tee的T恤,結合類似X光透視技術、AR增強現實技術的T恤,只要穿上這件衣服就能看透穿衣服的人。看點二:據外媒報道,蘋果將在今...

  • 小紅傘怎么給U盤殺毒

    日本变态强奷在线播放5000[2018-11-16]相信大部分人使用的電腦系統都是微軟的系統吧,其實Linux也是很多人常用的系統,而且還是開源免費的。它的功能也不下于windows,而且這個強大的操作系統還可以...

  • u盤殺毒專家下載/如何用u盤為電腦殺毒

    日本变态强奷在线播放5000[2018-08-25]電腦在使用一段時間后,就會在電腦中留下大量的來及,如果沒有及時清理這些垃圾的話,很容易造成磁盤空間不足的問題,導致很多程序無法正常運行,很多朋友在時候電腦過程中...

  • u盤中自帶的殺毒怎么刪除

    [2018-07-29]不同的系統文件在系統中起到的作用也不一樣,系統文件一旦遭到破壞也會出現不同程度的故障,而解決系統文件損壞的最好辦法就是對損壞的文件進行修復,損壞的系統文件修復方...

  • 最新文章

    最新推薦

  • U盤精靈  |   標簽  |   U盤測評  |   U盤安全  |   U盤資訊
    @powered by U盤精靈 2020