2 3 4 5 6 7 8 9 10 11 12

ctf-show-萌新-Web1-7

Web1

这题一打开就可以看到PHP源码,对源码分析,可以知道这题是intval漏洞。

首先我们先来了解一下intval函数的性质和注意事项

intval() 函数用于获取变量的整数值。

intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。
    
intval()不能用于object,否则会产生 E_NOTICE 错误并返回 1。

语法 int intval ( mixed $var [, int $base = 10 ] )

参数说明: $var:要转换成 integer 的数量值。 $base:转化所使用的进制。(默认是十进制)
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26


如果 base 是 0,通过检测 var 的格式来决定使用的进制;如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制(hex);否则, 如果字符串以 “0” 开始,使用 8 进制(octal);否则, 将使用 10 进制 (decimal)。
echo intval(42.88, 8);    // 42//思路:这里是先将42.88取整,取整后为42,因为不是字符串,将42当做10进制数转换,转换成10进制数,也就是本身,最后结果42
echo intval('42', 8);       // 34//思路:因为这个是字符串,base有效,将42当做8进制数转换成十进制数
    
返回值成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1

最大的值取决于操作系统。 
32 位系统最大带符号的 integer 范围是 -2147483648 到
2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。
64位系统上,最大带符号的 integer 值是 9223372036854775807。

字符串有可能返回 0,虽然取决于字符串最左侧的字符。

参考:CG-CTF-Web-MYSQL

这题源码下的id=1000,当intval($id)>999要返回false

所以可以使用’1000’字符串绕过 ,‘1000’等价于1000 id=2 or id=1000

还想知道其它的注入参数,可以参考

(42条消息) ctf.show-萌新计划(1-7)_1stPeak's Blog-CSDN博客

Web2

这题的源码和web1的源码差不多,就是多了一个if判断语句

preg_match语法

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

搜索 subject 与 pattern 给定的正则表达式的一个匹配。

参数说明:

  • $pattern: 要搜索的模式,字符串形式。
  • $subject: 输入字符串。
  • $matches: 如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。
  • $flags:flags 可以被设置为以下标记值:
    1. PREG_OFFSET_CAPTURE: 如果传递了这个标记,对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。 注意:这会改变填充到matches参数的数组,使其每个元素成为一个由 第0个元素是匹配到的字符串,第1个元素是该匹配字符串 在目标字符串subject中的偏移量。
  • offset: 通常,搜索从目标字符串的开始位置开始。可选参数 offset 用于 指定从目标字符串的某个未知开始搜索(单位是字节)。

返回值

返回 pattern 的匹配次数。 它的值将是 0 次(不匹配)或 1 次,因为 preg_match() 在第一次匹配后 将会停止搜索。preg_match_all() 不同于此,它会一直搜索subject 直到到达结尾。 如果发生错误preg_match()返回 FALSE。

讲这么多好像只是科普该函数的用法,这题还是用id='1000'注入

禁止使用OR字段, OR的字符型是|| ,因此直接使用这个即可

Web3

这题的源码和web2的源码差不多,就是preg_match()函数里 要搜索的字符串变化

这题还是用id='1000'注入绕过

禁止使用OR 或者 || OR || 行不通,那么试试url字符的or不就好了

Web4

这题的源码和web3的源码差不多,就是preg_match()函数里 要搜索的字符串变化

这题还是用id='1000'注入绕过,只是过滤变的越来越严格而已

Web5

这题的源码和web4的源码差不多,就是preg_match()函数里 要搜索的字符串变化

这里和前4题不同了,不能用id='1000'注入绕过了

这里过滤了',可以使用^按位异或来绕过

二进制^原理:

0^0 = 0
1^0 = 1
0^1 = 1
1^1 = 0
即同为假,异为真

0 1 0 0 0 0 0 1 ^0 1 0 1 1 0 1 0二进制编码的10进制分别是:65和90 但是通过 运算之后呢得到的是27 . 因此 我们要得到一个1000 就可以这样去构造即可

即使用144^888来注入绕过 。

Web6

这题的源码和web5的源码差不多,就是preg_match()函数里 要搜索的字符串变化

正则绕过过滤了 or 、||、%、^ 可以使用~~1000绕过 (~表示取反)

~~1000 1000经过两次取反之后是小于999的,所以可以通过IF语句,而再执行的时候貌似没有被执行~

Web7

这题的源码和web6的源码差不多,就是preg_match()函数里 要搜索的字符串变化

这题绕过了以上各种符号

那么我们可以使用hex编码或者0b即可

?id=0b1111101000 (IF里面只会读取id=0 而sql语句里面则执行整个命令)        -- 二进制绕过

posted @ 2021-10-16 15:02  MrDevil  阅读(282)  评论(0编辑  收藏  举报