bugku-web 前35题详解 (当然除去题目失效)

第二题:计算器

尝试输入96,发现只能输入一位数字,于是输入“9”,点击验证,弹出“输入有误!”

F12查看网页源代码,发现输入框的最大长度是1。

于是更改最大长度为100,输入正确答案96,得到flag。

第三题:web基础$_GET

题目分析:根据题面和所给代码,判断出是一道GET传参的题。GET传参时请求的参数是在URL中,所以直接在网址后面加上?what=flag。

第四题:web基础$_POST

题目分析:根据题面和所给代码,判断出是一道POST传参的题。POST传参时请求的参数是在页面表单中。所以借助在线工具或firefox中的Hackbar,以POST的方式提交给题目网址。

第五题:矛盾

题目分析:观察代码,发现有个关键函数is_numeric(),上网搜索这是一个检测变量是否为数字或数字字符串。如果传进去的是数字或字符串,则进不来这个函数,也就不办法输出了。

解决方法就是要绕过,既然不能输入数字字符串,那就输入数字加字母的字符串,例“1asdf”。根据“==”弱类型比较,如果等号两边类型不同,则会转换成相同类型的再比较,所以当一个字符串与数字比较时,会把字符串转换成数字,保留字母前的数字。

于是在地址栏加上?num=1z,就可以进入判断体,输出flag。

第六题web3

不使该页面创建对话框后,F12查看源代码,发现一串HTML编码的字符串

复制后,用在线工具解密,得到flag

刚开始在没有禁止创建对话框时,F12没有出现源代码,然后由于反复出现两个对话框,就想到利用Burp进行抓包,结果失败了,浪费了时间。

第七题 域名解析

题目分析:域名解析,就是把一个域名指向一个IP,方便记忆。

在本机C盘上有一个host文件,可以视为一个系统本地的DNS服务器,所以只要在上面添加123.206.87.240 flag.baidu.com 就可以了。

访问flag.baidu.com,得flag

第八题 你必须让他停下

题目分析:打开链接,网页一直显示不同的图片,想到用brup抓包让他停下来。

成功

第九题 本地包含

  题目打不开

第十题 变量1

题目分析:flag在变量中,GET方式从地址栏传参,Isset()检测变量是否已设置并非NULL,preg_match()用于执行一个正则表达式匹配,/^ 开始, \w表示任意一个单词字符,即[a-zA-Z0-9_] ,+将前面的字符匹配一次或多次,$/ 结尾。var_dump()判断一个变量的类型与长度,并输出变量的数值.$$”是可变变量的标志,可视为$($args)

解决方法:因为flag在变量中,所以我们可以利用GLOBALS输出全部的变量,即将args=GLOBALS,var_dump()会将$GLOBALS数组中存放的所有变量以数组的方式输出 得到flag。

第十一题 web5

题目分析:在题目描述中有JSP,在源代码中发现jother编码。

解决方法:把这些字符放入控制台中,有了flag。

题目背景:jother编码是在javascript语言中,利用少量特定字符构造精简的匿名函数对与字符串的编码方式。其中少量的特定字符包括:“+”、“!”、“(”、“)”、“[”、“]”、“{”、“}"。

目前任何浏览器都可以进行jother编码的,但是有些出于安全考虑,屏蔽了该功能。

第十二题 头等舱

题目分析:真的什么都没有。。。

解决方法:抓下包看看,结果Go一下就出现了

题目背景:Burp Repeater 通常用于多次重放请求响应和手工修改请求消息的修改后对服务器端响应的消息分析。可以从Proxy history、site map、Scanner等模块中右键菜单send to repeater发送到repeater,对页面数据进行修改,点击go,发送请求,右边响应请求。

第十三题 网站被黑

题目分析:webshell是网页后门的标志,所以可以用御剑扫描后台

进行访问

利用burpsuit中的Intruder模块爆破

输入密码,得到flag。

第十四题 管理员系统

题目分析:题中信息有“IP禁止访问,请联系本地管理员登陆,IP已被记录.”,“dGVzdDEyMw==”

解决方法:伪装成本地访问,X-Forwarded-For: 127.0.0.1。test123可能是用户名或密码。用brup抓包改包。

第十五题 web4

题目分析:源代码中有两大段URL编码和eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

unescape() 函数可对通过 escape() 编码的字符串进行解码。

加号(+)拼接字符串,数字。

解决方法:解码得p1= 67d709b2b,p2= aa648cf6e87a7114f1 把三个URL编码结合起来67d709b2b54aa2aa648cf6e87a7114f1,输入到表单里。提交,得到flag。

第十六题 flag在index里

题目分析:在网址上发现php伪协议 filefile的功能是访问本地文件系统。并且file关键字是get参数传递。

解决方法:利用访问本地文件的协议php://filter/,去访问index.php 具体方式是在网址上加上

file=php://filter/read=convert.base64-encode/resource=index.php

BASE64解码:

题目补充:为什么要设置读取方式是base64编码后的?通过我们传递的file参数,include()函数引入了index.php的编码格式,因为是编码格式的,所以执行不成功,则返回了源码的base64格式。反之,就会直接执行,没有任何信息出现,并且flag在注释中,更得不到。

而且源码中还有对php://协议的其它方法的过滤:../ tp data input 

题目背景:

第十七题 输入密码查看flag

题目分析:URL中出现baopo?yes的字样,所以brup抓包爆破。

解决步骤:

设置类型为数字,因为是5位数的密码,所以从10000到99999.

输入密码,得到flag

第十八题 点击一百万次

      题目打不开

第十九题 备份是个好习惯

题目分析:“备份”和两段一样的字符串。先找出备份文件.bak

解题步骤:用御剑后台扫描扫一下,出现了有.bak的网址

点进去,发现一段代码。

strstr()搜索字符串在另一字符串中的第一次出现,返回字符串的剩余部分(从匹配点)。执行过后,$str就是URL中“?”之后的字符串,包括“?”。

Substr()函数截取字符串,返回字符串的一部分。执行过后,$str就是去掉了“?”

Str_replace()函数以其他字符替换字符串中的一些字符。执行过后,就是将$str中的字符“key”替换成“”,去除$str中的“key”。

Parse_str()函数把查询字符串解析到变量中。根据下面的两个输出$key1,$key2,说明$str在经历了Str_replace()函数后,一定还有“key1”,“key2”。那么可以是kkeyey1或kekeyy1。

然后利用md5()不能处理数组的特性,我们可以构造payload为kkeyey1[]=1&kekeyy2[]=2。

或者利用弱比较的特性,使MD5的值是0开头的字符串,就可以通过判断。常见的有

QNKCDZO、240610708、s878926199a、s155964671a、s214587387a、s214587387a

第二十题 成绩单

题目分析:在Hackbar里输入id=2和id=2’#,页面正常;id=2’,页面异常。说明存在SQL注入点。

解决方法 :

尝试获取列数,利用order by对指定列对结果集排序,发现有4列。

接着使用union联合注入,union前后两个sql语句的选择列数要相同,记得把前面查询为空,id=0,显示正常,确实存在四列数据。

发现都有回显,开始爆破

首先爆库名, id=0‘ union select 1,2,3,database()#,得到数据库名skctf_flag

爆表名, id=0’ union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#,得到表名fl4g,sc

爆字段,id=0’ union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name=0x666c3467,得到字段skctf_flag。

查询数据,id=0’ union select 1,2,3,(select skctf_flag from fl4g)#,得到flag。

知识点补充:

Union select 手工注入

Mysql中的information_schema结构用来存储数据库系统信息。

schemata 存储数据库名的,

关键字段:SCHEMA_NAME,表示数据库名称

tables 存储表名的

关键字段:table_schema表示表所属的数据库名称;

table_name表示表的名称

columns 存储字段名的

关键字段:table_schema表示表所属的数据库名称;

table_name表示所属的表的名称

column_name表示字段名

爆所有数据库名

select group_concat(SCHEMA_NAME) from information_schema.schemata

得到当前库的所有表

select group_concat(table_name) from information_schema.tables where table_schema=database()

得到表中的字段名 将敏感的表进行16进制编码

adminuser=0x61646D696E75736572

select group_concat(column_name) from information_schema.columns where table_name=0x61646D696E75736572

得到字段具体的值    

select group_concat(username,0x3a,password) from adminuser

第二十一题 秋名山老司机

 题目失效

第二十二题 速度要快

题目分析:需要以post的方式提交margin。

不是flag,那可能是margin的值

额~ 得快点,不能手动解码,那写脚本。

第二十三题 cookies欺骗

题目分析:对URL中的a2V5cy50eHQ=进行base64解码,发现keys.txt。

解题思路:line空着,那随便赋给值1.既然出现了keys.txt,那去主页看看,要对index.php进行base64编码。出现了代码,说明index.php有东西,尝试将line依次赋予2、3、4…同样出现了不同的代码。

用爬虫,把代码内容盘下来。

第二十四题 never give up

题目分析:访问1p.html,页面自动跳转到bugku主页面。在链接前面加上view-source,直接查看1p.html源码,发现有url编码的字符串。

url解码,又出现base64加密的字符串

Base64解码,又出现url编码的字符串。

url解码,又出现一段代码

访问view-source:http://123.206.87.240:8006/test/f4l2a3g.txt,得到flag。

第二十五题 welcome to bugkuctf

(题目失效)

第二十六题 过狗一句话

题目分析:分析代码得,$poc_2($_GET[‘s’])=assert($_GET[‘s’])。

Assert()断言函数,判断表达式是否为真则继续,反之则中断。能够执行表达式。所以赋给s执行代码。

(题目无效)

第二十七题 字符?正则?

题目分析:当$IM为真,就输出key。所以分析preg_match里的正则表达式,在地址栏里加上id。

解题:"/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i"

/key 要有“key”

*key 匹配前面有0个或多个字符key

{4,7}key:\/ ——最少匹配4次且最多匹配7次key,加上一个“:/”。

\/(.*key)[a-z][[:punct:]] ——  首先一个“/”,接着(匹配前面有0个或多个字符key),最后匹配小写字母和任何标点符号

/i 标记大小写不敏感

所以构造出的id: keykeykeykeykey:/k/keya.

第二十八题 前女友

网页打不开

第二十九题 login1

题目分析:SQL约束攻击—— 前提在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。所以使用“admin   ”查询和“admin”查询的结果是一样的。

解题思路:先注册admin,果然admin已存在

注册“admin   ”

按新注册的“admin   ”登录,得到flag。

第三十题 你从哪里来

题目分析:打开网页,只有一句你是否来自google。所以只要抓包,改一下请求头referer,就可以成功。

解题:

题目背景:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。

第三十一题 md5 collision(NUPT_CTF)

题目分析:MD5碰撞,与md5有关,应该是比较之类的,抓包发现是GET传参。

解决方法:想到那几个0e开头的MD5,就一个一个尝试,结果就有了。。。

题目补充:使MD5的值是0开头的字符串,常见的有

QNKCDZO、240610708、s878926199a、s155964671a、s214587387a、s214587387a

第三十二题 程序员本地网站

题目分析:“请从本地访问”,即伪装成本地访问,在repeater中写入X-Forwarded-For:127.0.0.1。

题目补充:X-Forwarded-For: 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。

第三十三题 各种绕过

题目分析:$_GET['id'] = urldecode($_GET['id']); urldecode()对字符串进行URL解码

isset($_GET['uname']) and isset($_POST['passwd'])     isset() — 检测变量是否设置。

sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin')

解题思路:要使uname和passwd 的值不相等,但是sha1()加密的值相等。利用sha1不能处理数组的特性,将uname和passwd传入两个不同的数组,就可以得到flag。和“备份是个好习惯”中,考察点类似。

第三十四题 web8

题目分析:extract() 函数从数组中将变量导入到当前的符号表。trim() 函数移除字符串两侧的空白字符或其他预定义字符。file_get_contents() 函数把整个文件读入一个字符串中。

访问一下flag.txt。

解题思路:所以flag.txt里面是flags。也就是$ac=文件内容,$fn=文件名,就可以使$ac==$f.

第三十五题:细心

还以为题目真的崩了呢

题目分析:把各个地方点了一遍,并没有什么。

解题步骤:用御剑扫一下,出现了一个robots.txt

打开resusl.php

出现一个x,尝试x=password,admin等,是否能获得管理员页面。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章