php parse url ctf,【SSRF】如何繞過filter_var(), preg_match() 和 parse_url()

0x01 前言

這篇文章是在我看完一片國外安全大佬寫的文章后對其進行總結并翻譯得到的。

0x02 正文之繞過filter_var和preg_match

本片文章主要深入一種php ssrf的技術——如何繞過例如filter_var(), preg_match()和parse_url()等函數。

本次我進行測試的php版本全部為php v5.6.30

80ce73919edb

php-version

PHP 漏洞代碼

echo "Argument: ".$argv[1]."\n";

//check if argument is a valid URL

if(filter_var($argv[1], FILTER_VALIDATE_URL)){

//parse URL

$r = parse_url($argv[1]);

print_r($r);

//check if host ends with google.com

if(preg_match('/baidu\.com$/', $r['host'])){

//get page from URL

exec('curl -v -s "'.$r['host'].'"', $a);

print_r($a);

}else{

echo "Error: Host not allowed";

}

}else{

echo "Error: Invalid URL";

}

?>

這段代碼里使用了filter_var()函數,preg_match()函數來進行過濾,并用parse_url()函數進行解析,最后利用exec函數執行curl命令進行訪問網址。

在正式介紹繞過技術之前,我們需要了解一下以上函數的具體作用。

filter_var()

filter_var — 使用特定的過濾器過濾一個變量

80ce73919edb

FILTER_VALIDATE_URL

preg_match()

該函數使用正則表達式來進行匹配特定的字符串

parse_url()

80ce73919edb

parse_url

ok,了解了這些函數后,說說上面的測試代碼。這段代碼的是獲取第一個參數(這個參數是用來模擬通過$_GET或者$_POST方法獲取的),然后通過filter_var()函數判斷傳入的url時候符合規定。如果如何規定,通過parse_url來解析這個參數,獲取到host值,通過preg_match函數來判斷host時候以baidu.com結尾。

運行上面的代碼得到的正常結果取下:

80ce73919edb

如果不是正常的參數呢?

http://evil.com

80ce73919edb

繞過FILTER_VALIDATE_URL和正則表達式

許多URL結構保留一些特殊的字符用來表示特殊的含義,這些符號在URL中不同的位置有著其特殊的語義。字符“;”, “/”, “?”, “:”, “@”, “=” 和“&”是被保留的。除了分層路徑中的點段,通用語法將路徑段視為不透明。 生成URI的應用程序通常使用段中允許的保留字符來分隔。例如“;”和“=”用來分割參數和參數值。逗號也有著類似的作用。

例如,有的結構使用name;v=1.1來表示name的version是1.1,然而還可以使用name,1.1來表示相同的意思。當然對于URL來說,這些保留的符號還是要看URL的算法來表示他們的作用。

運行代碼試一下

80ce73919edb

發現報錯了,返回的是Invalid URL,那么因該是filter_var函數沒有繞過。filter_var函數可以解析多種協議,我們可以試一下不是http的協議,例如

0://evil.com;baidu.com

80ce73919edb

ok,成功繞過filter_var和preg_match函數!但是我們發現它并沒有解析我們的url,別擔心,我們試試添加一下端口號,因為不是http的話默認端口就不是80了

0://evil.com:80;baidu.com:80

80ce73919edb

ok,成功解析!

當然,我們之前說的逗號也是可以跟分號是一個作用的

80ce73919edb

依舊成功!

0x03 正文之繞過parse_url

parse_url函數不是用來驗證URL的正確性的,而是盡可能的去解析URL,并把URL分割成特定的部分。在這種情況下,可以使用將URL的部分變為變量從而進行繞過。

0://evil$baidu.com

80ce73919edb

這里,在bash中,$var是一個變量,在這個例子中$baidu這個變量未定義是個空,也就是說這個URL是0://evil.com,也就是0://evil.com,成功繞過!

但是這種方法也是有局限性的,因為需要利用bash中的特性,因此只有在php腳本中使用exec()、system()等命令執行的函數執行curl或者wget命令時才可以完成。

0x04 正文之data://偽協議和xss利用

與上面的exec不同,這里我們使用的是filter_get_content函數,php的測試代碼如下:

echo "Argument: ".$argv[1]."\n";

// check if argument is a valid URL

if(filter_var($argv[1], FILTER_VALIDATE_URL)) {

// parse URL

$r = parse_url($argv[1]);

print_r($r);

// check if host ends with google.com

if(preg_match('/baidu\.com$/', $r['host'])) {

// get page from URL

$a = file_get_contents($argv[1]);

echo($a);

} else {

echo "Error: Host not allowed";

}

} else {

echo "Error: Invalid URL";

}

?>

這次我們的任務是在響應主體中修改內容,添加一個“Hacked by Pino_HD”

data://text/plain;base64,SGFja2VkIGJ5IFBpbm8Kbaidu.com

80ce73919edb

發現parse_url函數把text設置成了host,然后報了Host not allowed錯誤。但是別擔心,我們可以注入一些東西到MIME類型的地方,因為php是不關心MIME類型的。。

data://baidu.com/plain;base64,SGFja2VkIGJ5IFBpbm8K

80ce73919edb

ok,成功在響應包中寫入我們想要寫的東西。因此我們是可以控制響應體的內容,從而形成xss

80ce73919edb

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532263.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532263.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532263.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python json解析_python讀取json文件并解析

原博文 2018-07-09 18:35 ? # -*- coding: utf-8 -*- import os import json import sys reload(sys) sys.setdefaultencoding(utf-8) filelistos.listdir(E:\\log\\files\\) for ite... 相關推薦 2019-12-05 20:03 ? 如何使用 Python 語言來編碼和解碼 JSON 對象。 JSON(Jav…

oracle進程瞬間暴增,oracle goldengate ogg 源段傳輸進程lag延遲不斷增加的原因?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓了解GoldenGate中LAG的含義GGSCI中顯示的LAG代表 事務被寫入到磁盤介質中的時刻例如Oracle中redo被寫入到online redo logfile中 和 Replicat將同一個事務分發到目標數據庫的時刻 之間的時間間隔。通俗地說,一個事務內的…

python中文詞云圖代碼_Python簡單實現詞云圖代碼及步驟解析

一、安裝 wordcloud pip install wordcloud 二、加載包、設置路徑 import os from wordcloud import WordCloud import matplotlib.pyplot as plt os.chdir(E:\\pyspace\\tmp) 三、詞云圖示例 1、默認參數示例 text Keep it simple and stupid. wc WordCloud() # 實例化詞云圖…

linux 命令 空格轉義,在Linux中,如何轉義SCP復制路徑中的空格?

問題描述我是Linux新手,我想將文件從遠程復制到本地系統…現在,我在Linux系統中使用scp命令。當我嘗試將其復制時,我有一些文件夾或文件名帶有空格文件,它顯示錯誤消息:“沒有這樣的文件或目錄”我試過了:s…

usb大容量存儲設備驅動程序_20年歷史了!為什么USB接口還存在?網友:原來如此...

USB接口作為計算機領域應用最廣泛的數據接口,已有20多年的歷史。和它的名字一樣,USB(Universal Serial Bus)最初也是為統一的數據接口而設計的。你幾乎可以用它來代替計算機的各種外部數據接口,只需為它設計相應的驅動程序。隨著市場對USB接口…

linux終端炫酷命令,你不得不知道11個炫酷的 Linux 終端命令

很多朋友都很喜歡Linux ,Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基于POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統,Linux是一款免費的操作系統,用戶可以通過網絡或其他途徑免費獲得,并可…

lasso回歸_一文讀懂線性回歸、嶺回歸和Lasso回歸

(圖片由AI科技大本營付費下載自視覺中國)作者 | 文杰編輯 | yuquanle本文介紹線性回歸模型,從梯度下降和最小二乘的角度來求解線性回歸問題,以概率的方式解釋了線性回歸為什么采用平方損失,然后介紹了線性回歸中常用的兩種范數來解決過擬合和…

springcloud架構特點_打造企業級微服務平臺架構,分布式應用場景管理

微服務平臺架構是一項在云中部署應用和服務的新技術。大部分圍繞微服務的爭論都集中在容器或其他技術是否能很好的實施微服務。微服務系統可以在“自己的程序”中運行,并通過“輕量級設備與HTTP型API進行溝通”。關鍵在于該服務可以在自己的程序中運行。通過這一點我…

linux 看防火墻的啟停日志,LINUX下防火墻iptables的日志管理

iptables的日志(log)由syslogd紀錄和管理。初始存放在 /var/log/messages里面。自動采取循環紀錄(rotation)的方式記錄。但是由于混在 messages中,對于管理和監視產生了不便。這里,我簡單介紹一下我的 iptables日志的管理,循環,和…

怎么判斷一個字符串的最長回文子串是否在頭尾_LeetCode 5 迅速判斷回文串的Manacher算法...

本文始發于個人公眾號: TechFlow題意Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.Link: https://leetcode.com/problems/longest-palindromic-substring/翻譯給定一個字符串s&#xff0c…

linux內核沒有iobuf,LINUX2.6.26.6內核下雙口RAM的驅動函數測試成功!

驅動程序:#include //#include #include #include #include #include #include #include //#include #include //#include #include #include #include #include //#include #include #include #include #include #include #include #include MODULE_LICENSE("…

spring和mybatis結合做簡單的增刪查改系統_springbootamp;amp;vue簡單的景點信息管理系統...

springboot&&vue簡單的景點信息管理系統這兩天閑著沒有什么事,就根據陳哥的教程,試著寫了一個springboot和vue的簡單的景點信息管理系統。也就大致實現了最基本的增刪查改。先看看效果圖吧:1、登陸界面: 2、注冊界面&…

linux 內核 丟棄分片包,LINUX內核關于IP分片重組問題請教

最近研究學習IP分片重組,也拜讀了不少dx的閱讀理解。可還是有疑問,請教xdm。源代碼:linux-2.4.26\linux-2.4.26\net\ipv4\ip_fragment.cIP分片的重組大概經過以下幾個函數:0/ ip_defrag1/ ip_find-->ip_frag_create-->ip_frag_intern2/…

spark算子_十、Spark之詳解Action類算子

常用Action類算子列表reduce(func): 通過func函數來對RDD中所有元素進行聚合運算,先運算分區內數據,再運算分區間數據。scala> val rdd1 sc.makeRDD(1 to 100)rdd1: org.apache.spark.rdd.RDD[Int] ParallelCollectionRDD[4] at makeRDD at :24# 對…

linux 庫函數 劫持,Linux hook技術之-Ring3下動態鏈接庫.so函數劫持

劫持普通函數當然沒有什么意思了!我們要劫持的是系統函數!我們知道,Unix操作系統中對于GCC而言,默認情況下,所編譯的程序中對標準C函數(fopen、printf、execv家族等等函數)的鏈接,都是通過動態鏈接方式來鏈…

await原理 js_「速圍」Node.js V14.3.0 發布支持頂級 Await 和 REPL 增強功能

本周,Nodejs v14.3.0 發布。這個版本包括添加頂級 Await、REPL 增強等功能。REPL 增強通過自動補全改進對 REPL 的預覽支持,例如,下圖中當輸入 process.ver 之后,不需要輸入剩下的實際內容,它幫我們生成了自動補全的輸…

在linux安裝requests庫命令,在Linux--Ubuntu18.04環境下安裝requests庫

之前在服務器上裝過requests庫,但是記憶中花了好大的力氣才成功,現在因為一次意外,服務器重裝系統,現在這些亂七八糟的庫又要重裝一遍,與上次不同的是,這次我裝一遍就成功了。現在分享一下成功的經歷。Pyth…

linux輸入ls后不顯示_零基礎學習之Linux基礎命令小結

安裝完重啟后,沒有像sery所說在圖形界面崩潰了,由于我沒有安裝X-WINDOWS而是直接進入了文本界面。如果你想做linux管理的話,最好在文本界面下工作,這樣會適應如下圖:第一行顯示的是我們所安裝的linux是Red Hat 企業4第二行顯示的是…

redhat enterprise linux 哪個版本好,Red Hat Enterprise Linux 版本顯示中(Santiago)是啥意思?...

樓主的邏輯還有問題。1、linux跟windows都是一種操作系統,但是它用的分區格式是ext3的,ntfs和fat都不合適。安裝過程中你可以自己選擇刪除現有分區創建新分區,但如果你不了解,很可能把所有的分區都清了。2、redhat分區多大合適看你…

.gitignore文件_【第1739期】為Git倉庫里的.idea文件夾正名

前言.idea該不該提交到代碼倉庫中呢?你的意見呢?今日早讀文章由《Flask Web開發》作者李輝分享。正文從這開始~~在網絡上,我曾多次看到人們對于Git倉庫中的.idea文件夾的偏見。最近的一次是在某個博客中技術專家對于志…