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,虽然取决于字符串最左侧的字符。
这题源码下的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 可以被设置为以下标记值:
- 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语句里面则执行整个命令) -- 二进制绕过