PHP中GPC繞過的一些總結

2021-04-18 21:33:36 字數 2438 閱讀 3102

1.通過資料庫(文字)中轉

通過資料庫中**

(注意存入資料庫和select出的資料)

使用者輸入===>gpc/addslashes()**********>資料庫*****====>執行sql語句/include/寫入快取檔案

insert/update                        select                             

這個問題是程式設計師容易忽略的,往往只是依靠gpc或addslashes函式對使用者直接輸入的資料進行處理,這樣資料中的'"等都會被/轉義,這樣就能正確的執行sql語句,有效防止注入攻擊了。但存入資料庫的資料呢?在執行完sql語句存入資料庫的是經過gpc處理前的原始資料,那麼當程式再select出的就是受汙染的資料了,如果把select出的資料再執行sql語句,那麼就觸發了sqlinj,如果直接寫入快取檔案的話就有可能直接拿shell了:)

通過文字中**

使用者輸入===>gpc/addslashes()===>寫入文字檔案===>include===>再次寫入文字檔案/執行sql語句

這個和通過資料庫中轉大致是一樣的,對於寫檔案的操作如果處理不當是有可能被攻擊者直接拿shell的,我們來看看php168的乙個**片段:

複製內容到剪貼簿

**:function login_logs($username,$password)

}write_file(php168_path."cache/adminlogin_logs.php",$writefile);

}

php168在登入後台時如果輸入的使用者名稱或密碼有誤就會執行這個login_logs函式把登入者的資訊記錄在adminlogin_logs.php,如果使用者輸入的$username的資料是「";eval($_post[cmd]); //」,前面的"被閉合了,成功的寫入了shell。但如果gpc為on的話,"會被轉義成/",無法利用了。但注意這裡會先包含adminlogin_logs.php,並迴圈陣列把資料再次寫入adminlogin_logs.php,要知道,這裡的/僅僅是轉義字元,所以include後$logdb依舊是受汙染的原資料,再次寫入檔案時"就起作用了,成功寫入了shell。

2.通過編碼

utf-7(+acc-)===>gpc/addslashes()===>mb_convert_encoding()===>utf-8(')

這個問題的具體例子可見:

0xbf27===>gpc/addslashes()===>0xbf5c27===>執行sql語句(資料庫編碼支援多位元組)

php裡的函式大多是把字串作為單位元組進行處理的,那麼如果資料庫編碼支援多位元組呢,我們可以利用這個特性引入',而這裡,gpc不但沒起作用還幫了我們的忙:)

詳見:http://shiflett.org/blog/2006/ja ... -real-escape-string

使用者輸入(經過urlencode/rawurlencode/base64_encode等函式處理)===>gpc/addslashes()===>urldecode/rawurldecode/base64_decode等函式===>執行sql語句/include

通過二次編碼繞過gpc/addslashes,比如'的url編碼二次編碼%25%27。

3.一些函式的錯誤處理

看看下面的函式處理的字串:

substr($_get['a'], 1);

假設輸入的$_get['a']為'haha,經過gpc/addslashes()會變為/'haha,再經過substr處理後又變回了'haha.

處理字串的函式有很多,往往程式設計師的乙個不注意就能給我們帶來很多有意思的利用:)

4.字串和陣列

看看下面的**:

$a = $_get['a'];

echo $a[1];

輸入$_get['a']為'haha,經過gpc/addslashes()會變為/'haha,看看手冊裡對字串的一段描述:

字串中的字元可以通過在字串之後用花括號指定所要字元從零開始的偏移量來訪問和修改

這裡也可以用方括號替代花括號(這是為了相容較早的php版本,其實就是把字串當陣列處理的),有了這個特性我們能做很多事啊,比如這裡$a[1]的輸出就是'了:),當然具體大的利用要看具體的**。

5.php自身的一些缺陷

php5的gpc對$_server的忽略

見劍心的《php5繞過缺陷》:

php某些版本對%00的錯誤轉義

PHP中GPC繞過的一些總結

1.通過資料庫 文字 中轉 通過資料庫中 注意存入資料庫和select出的資料 使用者輸入 gpc addslashes 資料庫 執行sql語句 include 寫入快取檔案 insert update select 這個問題是程式設計師容易忽略的,往往只是依靠gpc或addslashes函式對使用...

php5中的GPC繞過缺陷

magic quotes gpc選項是php中的乙個重要的安全設定,當該選項為on也就是開啟的時候,所有從get,post,cookie傳遞過來的資料中的 以及null等元字元都會被自動的加上 實現轉義,這個選項使得sql注入或者插入 以及xss中引入字串或者改變程式流程變得困難,但是在php5中一...

總結的一些PHP開發中的技巧

1 準確的理解各種概念。現在的新東西層出不窮,望文生義和一知半解對開發工作有害無益 2 美觀,適當的空行 縮排,空格,這樣能更容易理解 段的意思 3 一定要寫注釋,而且要恰當的注釋,要不然後面的維護工作或者接手 的人會痛哭不已 4 靜態方法 類訪問許可權 介面 抽象類應該綜合起來使用,發揮各自特點 ...