NssctfRound#17_web

继续学习

【Web】NSSCTF Round#17 Basic个人wp(全)-CSDN博客

真.签到

先访问robot.txt,看到登陆的账号密码,然后放到随波逐流里面解密,登陆后进入下一层。

主要是绕过PHP的is_numeric函数

bool is_numeric ( mixed $var )
如果指定的变量是数字和数字字符串则返回 TRUE,否则返回 FALSE,浮点型返回空值即 FALSE,不仅检查十进制,同时也检查十六进制

绕过方法
is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后,因为查看函数发现该函数对于第一个空格字符会跳过空格字符直接判断后面的内容

构造:

1
2
3
4
?num = 1%00
?num = 1%20
?num = 1'
?num = 1a

对于这道题来说只要在1后跟任意字符都可以绕过is_numeric函数的判断
这道题的主要考点并非is_numeric函数而是对弱等于的绕过

关于弱等于
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行
它的转换机制如下:

<?php
var_dump("admin"==0);  //true
var_dump("1admin"==1); //true
var_dump("2admin"==2); //true
var_dump("ad1min"==1); //false
var_dump("admin1"==1); //false
var_dump("admin1"==0); //true
var_dump(0e1234 == 0e56789); //true 
?>
  1. 第一行代码,’admin’被强制转换为数字型和0比较,由于admin为字符串,则转换出的结果为0,所以相等

  2. 观察第二到第六行代码,弱等于强制转换字符串后的值与数字的位置有关,只有数字位于整个字符串开头时才会转换为此数字,否则均转换为0

  3. 0e1234与0e56789比较时,会将此类字符串识别为科学计数法,0的n次方均为0,因此相等

5ac3fe7a96a047f8a52ba08f28a76e5d

来看到这题,其实是两个比较,都是弱类型比较,

1
?nss=732339662,1

第一层if会判断为ture,第二层的is_numeric会判断0,进而if为ture。

真的是文件上传吗?

后端会执行python xxx.png/jpg

直接改后缀上传python命令。