BugkuCTF web_21-30
发布日期:2021-05-07 06:22:50 浏览次数:21 分类:技术文章

本文共 4191 字,大约阅读时间需要 13 分钟。

21 秋名山老司机

多刷新几次网页发现说让用post提交value值来获取flag。

注意要用session请求方式,否则网页信息时是一次连接,post提交时又是一次连接,内容不一样。

import requestsimport res = requests.Session()r = s.get("http://120.24.86.145:8002/qiumingshan/")searchObj = re.search(r'^
(.+)=\?;
$', r.text, re.M|re.S) #re.M|re.S匹配多行或匹配一行data = { "value":eval(searchObj.group(1)) #这里是value是从网页提示中得到的}flag = s.post("http://120.24.86.145:8002/qiumingshan/", data=data)print(flag.text)

————————————

22 速度要快

bp抓包发现headers里面有flag信息,base64解码,拿到flag。但是flag早就变了,所以只能写脚本了。

byte型转str型----t=t.decode()

str型转byte型----t=t.encode()

import requestsimport base64url = "http://120.24.86.145:8002/web6/"r = requests.Session()headers = r.get(url).headers    #因为flag在消息头里 tmp = base64.b64decode(headers['flag'])   tmp = tmp.decode()#为了下一步用split不报错,b64decode后操作的对象是byte类型的字符串,而split函数要用str类型的 flag = base64.b64decode(tmp.split(':')[1])  #获得flag:后的值data = {   'margin': flag}print (r.post(url, data).text)		#post方法传上去

————————————

23 cookies欺骗

观察url ,发现 a2V5cy50eHQ= 是一个base64编码,解码后是keys.txt

filename=index.php,访问,不过要用base64编码。
获取每一行php代码

import requestsline = 30for i in range(30):    url = "http://123.206.87.240:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"    print(requests.get(url).text)
'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];}?>

filename=keys.php

cookie:margin=margin拿到flag

————————————

24 never give up

查看源码,有个注释:1p.html,访问后跳回bugku主站,没啥用,直接用view-source:查看1p.html的源码。

发现一段编码,像url编码,解码后在用base64解码,再用url解码后发现php语句

";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拿到flag。

eregi("111".substr($b,0,1),"1114") and substr($b, 0, 1)!=4)这里是让111加上b的第一个字符作为正则表达式去匹配1114,但是b的第一个字符不能是4,所以可以利用eregi漏洞让b的第一个字符为空就好了

补充

stripos($a, ‘.’) 查找 ‘.’ 在字符串 $a中第一次出现的位置

file_get_contents() 函数把整个文件读入一个字符串中。

加上@ 是为了防止file_get_contents获取失败返回至命错误,影响后面的程序运行

ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据。

————————————

25 welcome to bugkuctf

参考链接https://www.cnblogs.com/liangxiyang/p/10016776.html

参考链接https://blog.csdn.net/yh1013024906/article/details/81087939

php伪协议

php://input是一个只读信息流,当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。
$HTTP_RAW_POST_DATA这个变量和 file_get_contents(php://input)的内容是一样的。如果要开启这个变量,需要修改配置文件,找到 always_populate_raw_post_data这个选项,设置为On,然后重新启动web服务器,就可以了。而使用php://input 不需要修改php配置文件。

php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取;根据名字,filter,可以很容易想到这个协议可以用来过滤一些东西。

例如:构造php://filter/read=convert.base64-encode/recource=index.php;
这句话的意思是我们用base64编码的方式来读文件index.php;这时页面会显示出源文件index.php经过base64编码后的内容,之后进行解码即可查看文件内容。

preg_match()函数是用来执行正则表达式的一个常用的函数

__toString() 是魔术方法的一种,具体用途是当一个对象被当作字符串对待的时候,会触发这个魔术方法 .

__toString() 方法用于一个类被当成字符串时应怎样回应。

index.php是主页文件,是获取网页源码的一个重要文件

序列化和反序列化

在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。
反序列化用于把序列化的字符串恢复原状
serialize() 函数用于序列化对象或数组,并返回一个字符串。
serialize() 函数序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结构不会改变。
如果想要将已序列化的字符串变回 PHP 的值,可使用 unserialize()。

————————————

26 过狗一句话

效果为$poc_1={ a,s,s,e,r,t}$poc_2=assertassert($_GET['s'])

explode():使用一个字符串分割整个字符串,并返回由字符串组成的数组。

assert():把字符串按照php代码来执行。

print_r(scandir(’./’))

print_r() 函数用于打印变量,以更容易理解的形式展示。
scandir() 函数返回指定目录中的文件和目录的数组。

————————————

27 字符?正则?

highlight_file() 函数对文件进行语法高亮显示。

trim() 函数移除字符串两侧的空白字符或其他预定义字符。

最前面的“/”与最后面的“/”是分隔符,表示正则表达式的开始与结束。

————————————

28 前女友(SKCTF)

strcmp()漏洞

传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会return 0 也就是虽然报了错,但却判定其相等了。

md5()漏洞

MD5不能处理数组,对数组md5会得到null

构造http://123.206.31.85:49162/?v1[]=1&v2[]=2&v3[]=3得到flag。

————————————

29 login1(SKCTF)

SQL约束攻击

SQL查询中:

SELECT *FROM username WHERE username=“admin”
SELECT *FROM username WHERE username="admin       "
查询结果是一样的。
所以这道题直接在注册用户名时候后面加空格伪造一个admin就可以得到答案。

————————————

30 你从哪里来

伪造Referer是谷歌https://www.google.com就可以了。

上一篇:BugkuCTF web_31-40
下一篇:XCTF web高手进阶区_1-6

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月10日 20时49分56秒