CG-CTF-Web-MYSQL

MYSQL

1.题目
CG-CTF-Web-MYSQL_第1张图片
2.我们打开题目地址
CG-CTF-Web-MYSQL_第2张图片
3.看来有个robots.txt,我们来访问一下,出现下图所示
CG-CTF-Web-MYSQL_第3张图片
4.那我们接下来分析代码:


if($_GET[id]) {
  mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);   //连接数据库
  mysql_select_db(SAE_MYSQL_DB);   //选择数据库
  $id = intval($_GET[id]);		  //intval是将变量取整(注:如果变量是小数,那么变量小数位不能为0,如果为0,会被认为是整数)
  $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));   //sql查询语句
  if ($_GET[id]==1024) {   //如果id=1024,输出no! try again,否则输出查询结果,这里应该是flag
      echo "

no! try again

"
; } else{ echo($query[content]); } } ?>

5.根据以上代码分析,这里是利用intval()函数来绕过,输出flag。因此,url传入id=1024.3,实现绕过if判断,输出flag
CG-CTF-Web-MYSQL_第4张图片
注:

  • 代码主要函数语法

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

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

PHP 4, PHP 5, PHP 7

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

参数说明: $var:要转换成 integer 的数量值。 $base:转化所使用的进制。(默认是十进制)

如果 base 是 0,通过检测 var 的格式来决定使用的进制: 如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制
(hex);否则, 如果字符串以 “0” 开始,使用 8 进制(octal);否则, 将使用 10 进制 (decimal)。 返回值
成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。

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

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

特别注意:除非 var 是一个字符串,否则 base 不会起作用。也就是说如果第一个参数不是字符串,那么第二个参数的进制就无效,即默认取整后,让取整后的数当做10进制数转换成10进制数,也就是本身了…
但有特例,正如上面所说,如果base为0,就自动检测var参数,0开头,当做8进制数,0x开头当做16进制数

  • 举例:

echo intval(42);                      // 42
echo intval(4.2);                     // 4
echo intval('42');                    // 42
echo intval('+42');                   // 42
echo intval('-42');                   // -42
echo intval(042);                     // 34
echo intval('042');                   // 42
echo intval(1e10);                    // 1410065408
echo intval('1e10');                  // 1
echo intval(0x1A);                    // 26
echo intval(42000000);                // 42000000
echo intval(420000000000000000000);   // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42.88, 8);                // 42//思路:这里是先将42.88取整,取整后为42,因为不是字符串,将42当做10进制数转换,转换成10进制数,也就是本身,最后结果42
echo intval('42', 8);                 // 34//思路:因为这个是字符串,base有效,将42当做8进制数转换成十进制数
echo intval(array());                 // 0
echo intval(array('foo', 'bar'));     // 1
?>

记住一点,以指定进制转换后,最后选择的结果数都是10进制数,例:
因为非字符串无效,这里,我就选择字符串

        
echo intval('42.88', 16);//66
echo intval('22.22',6);//18
?>

CG-CTF-Web-MYSQL_第5张图片
CG-CTF-Web-MYSQL_第6张图片

你可能感兴趣的:(CTF刷题)