ctf.show-萌新计划(1-7)

前言

ctf.show的萌新计划,简单记录一下绕过方法

第一题

源码:

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>

# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
    $id = $_GET['id'];
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

思路:这题考察的是intval漏洞,可以参考:CG-CTF-Web-MYSQL,这题需要满足id=1000,同时intval($id) > 999要返回false,所以:
(1)可以使用’1000’字符串绕过,虽然'1000'进行intval后还是1000,但是,看下面:

ctf.show-萌新计划(1-7)_第1张图片
'1000'绕过了if(intval($id) > 999),并且最后id也是等于1000,在mysql中1000与'1000'是等价的("1000"同理),如下图
ctf.show-萌新计划(1-7)_第2张图片
(2)也可采用125<<3,例:

ctf.show-萌新计划(1-7)_第3张图片
125<<3在数据库中依旧可以运行
ctf.show-萌新计划(1-7)_第4张图片
注:>>无法绕过因为例如8000>>3,在这里无法绕过f(intval($id) > 999)

(3)也可以使用680|320绕过
ctf.show-萌新计划(1-7)_第5张图片
在数据库中|也可以查询
ctf.show-萌新计划(1-7)_第6张图片
(4)也可使用hex(16进制绕过)
例如:使用0x3e8绕过
ctf.show-萌新计划(1-7)_第7张图片
在数据库中hex(16进制)也可以查询
ctf.show-萌新计划(1-7)_第8张图片
(5)在这里&无法绕过,因为构造id=1000后,绕过if(intval($id) > 999)时都是大于或等于1000的值

第二题

源码:


# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
        $id = $_GET['id'];
    if(preg_match("/or|\+/i",$id)){
            die("id error");
    }
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

关键代码:

if(preg_match("/or|\+/i",$id))

payload:同样可以使用'1000'来绕过

第三题

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>

# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
        $id = $_GET['id'];
    if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){
            die("id error");
    }
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

关键代码:

if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id))

payload:同样可以使用'1000'绕过

第四题

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>

# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
        $id = $_GET['id'];
    if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

关键代码:

if(preg_match("/or|\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id))

payload:使用'1000'

第五题

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>

# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
        $id = $_GET['id'];
    if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

关键代码:

if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id))

payload:这里过滤了',可以使用^按位异或来绕过
二进制^原理:

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

例如,使用144^888来绕过
^在数据库中也可使用,虽然会报错
ctf.show-萌新计划(1-7)_第9张图片

第六题

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>

# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
        $id = $_GET['id'];
    if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

关键代码:

if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\+|select/i",$id))

payload:可以使用~~1000绕过
~表示取反,~在数据库中也可使用:
ctf.show-萌新计划(1-7)_第10张图片

第七题

<html>
<head>
    <title>ctf.show萌新计划web1</title>
    <meta charset="utf-8">
</head>
<body>

# 包含数据库连接文件
include("config.php");
# 判断get提交的参数id是否存在
if(isset($_GET['id'])){
        $id = $_GET['id'];
    if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id)){
            die("id error");
    }
    # 判断id的值是否大于999
    if(intval($id) > 999){
        # id 大于 999 直接退出并返回错误
        die("id error");
    }else{
        # id 小于 999 拼接sql语句
        $sql = "select * from article where id = $id order by id limit 1 ";
        echo "执行的sql为:$sql
"
; # 执行sql 语句 $result = $conn->query($sql); # 判断有没有查询结果 if ($result->num_rows > 0) { # 如果有结果,获取结果对象的值$row while($row = $result->fetch_assoc()) { echo "id: " . $row["id"]. " - title: " . $row["title"]. "

"
. $row["content"]. "
"
; } } # 关闭数据库连接 $conn->close(); } }else{ highlight_file(__FILE__); } ?> </body> <!-- flag in id = 1000 --> </html>

关键代码:

if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id))

palyload:可以使用二进制绕过(0b开头表示二进制)
二进制在数据库中也可以使用,0b开头的数字会自动转换为数字,例:
ctf.show-萌新计划(1-7)_第11张图片
注1:数据库中的数据创建过程:
在这里插入图片描述
ctf.show-萌新计划(1-7)_第12张图片
ctf.show-萌新计划(1-7)_第13张图片
在这里插入图片描述

你可能感兴趣的:(CTF闯关)