红日代码审计(day1-day14)

该来的始终还是要来的 ,该审计的始终还是要审计的

day_1:wishlist

in_array漏洞
未加第三个参数的强转漏洞

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']);

经过分析
这里存在in_array漏洞,如果in_array第三个参数没有设置为true,就默认是false,即代表可以进行强转,将7shell.php转为7.php
当然一个文件名不会影响什么,但如果和sql注入结合,就不一样了
官方给了一道题,关键部分如下:
红日代码审计(day1-day14)_第1张图片这里可以使用上面讲的强转绕过


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

这里没有过滤报错注入需要用到的函数,因此这里可以使用updatexml和extractvalue函数,注意,由于这儿过滤了concat,所以替换成make_set
官方文档解释如下:
红日代码审计(day1-day14)_第2张图片MAKE_SET(bits,str1,str2,…),取bits的二进制的反码,按照反码位上为1查询
例如make_set (3,a,b,c,d,e)
3的二进制是0011,反码位1100,故查询出来的结果是:a,b
所以payload

?id=3 and (select extractvalue(2,make_set(3,0x7e,(select * from flag))))--+

或者

?id=3 and (select updatexml(2,make_set(3,0x7e,(select * from flag)),3))--+

注意:由于过滤了or,所以查询所有表的时候不能使用information_schema,但是可以使用mysql5.7以上的sys.schema_auto_increment_columns

day_2:Twig

filter_var
url检验漏洞

// composer require "twig/twig"
require 'vendor/autoload.php';

class Template {
  private $twig;

  public function __construct() {
    $indexTemplate = ' .
      'src="https://loremflickr.com/320/240">' .
      'Next slide »';

    // Default twig setup, simulate loading
    // index.html file from disk
    $loader = new Twig\Loader\ArrayLoader([
      'index.html' => $indexTemplate
    ]);
    $this->twig = new Twig\Environment($loader);
  }

  public function getNexSlideUrl() {
    $nextSlide = $_GET['nextSlide'];
    return filter_var($nextSlide, FILTER_VALIDATE_URL);
  }

  public function render() {
    echo $this->twig->render(
      'index.html',
      ['link' => $this->getNexSlideUrl()]
    );
  }
}

(new Template())->render();

这个很典型了,filter_var对url存在的典型漏洞
可以通过:

javascript://comment%250aalert(1)

首先这条语句满足url的要求,//是单行注释,%25是%的url编码(直接在url上面%会变成%25),%0a是换行符,这样alert(1)就在下一行,没有被注释;
不过,这种跨站脚本攻击本身危害不大。
但是,跟命令执行放在一起,危害就大了。

同是这道对应的ctf题:


$url=$_GET['url'];
if(isset($url) && filter_var($url,FILTER_VALIDATE_URL))
{
	$site_info=parse_url($url);
	if(preg_match('/sec-redclub.com$/',$site_info['host']))
	{
		exec('curl"'.$site_info['host'].'"'.$result);
		echo "

you have curl {$site_info['host']}successfully!