CTFer成长记录——Web专题·修改页面元素

发布时间 2023-07-09 10:12:21作者: MiracleWolf

一、题目连接

https://ctf.show/challenges#web1-143

二、题意分析

打开靶场,可以看到网页直接给出了源代码:

  方法1

  通过该php语言以及最下面的提示,只有id = 1000的时候才能获取到flag,但是如果id简单的等于1000,那么会被intval()函数给跳过导致直接退出。

  intval()是一个获取变量整数值的函数,语法:intval($x,进制),返回整数。默认是10进制,当遇到非数字开头时,则会停止转换,返回0。所以我们需要传入id的值,使得该id的值为1000且让intval()停止转换。

  因此id传入1000的十六进制即可:0x3E8。

  方法2:

  该源代码直接把变量$id拼在了sql语句中,会产生SQL注入的风险,因此我们可以利用该特性:

  数据的查询是从article这个表中查询的,我们直接用联合查询union select 查出来即可。

  payload:?id=1 union select *from article;--+,--+是注释符,不用#是因为#会被过滤,可以用%27代替。;是闭合sql语句。由于原sql语句中有limit限制查询结果返回的数量为1,所以要把它注释掉。

  

三、解法步骤

    法一:payload:?id=0x3E8

      法二:payload:?id=1 union select *from article;--+

四、总结

  本题方法其实很多,这里列举了通过审计代码发现intval()函数的安全漏洞:直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(\0)结束转换",在某些应用程序里由于对intval函数这个特性认识不够,错误的使用导致绕过一些安全判断导致安全漏洞;又发现了SQL注入点,最后通过联合查询获取数据库信息,从而得到flag。