ctf.show-萌新计划(1-7)
文章目錄
- 前言
- 第一題
- 第二題
- 第三題
- 第四題
- 第五題
- 第六題
- 第七題
前言
ctf.show的萌新計劃,簡單記錄一下繞過方法
第一題
源碼:
<html> <head><title>ctf.show萌新計劃web1</title><meta charset="utf-8"> </head> <body> <?php # 包含數據庫連接文件 include("config.php"); # 判斷get提交的參數id是否存在 if(isset($_GET['id'])){$id = $_GET['id'];# 判斷id的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$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,但是,看下面:
'1000'繞過了if(intval($id) > 999),并且最后id也是等于1000,在mysql中1000與'1000'是等價的("1000"同理),如下圖
(2)也可采用125<<3,例:
125<<3在數據庫中依舊可以運行
注:>>無法繞過因為例如8000>>3,在這里無法繞過f(intval($id) > 999)
(3)也可以使用680|320繞過
在數據庫中|也可以查詢
(4)也可使用hex(16進制繞過)
例如:使用0x3e8繞過
在數據庫中hex(16進制)也可以查詢
(5)在這里&無法繞過,因為構造id=1000后,繞過if(intval($id) > 999)時都是大于或等于1000的值
第二題
源碼:
<?php # 包含數據庫連接文件 include("config.php"); # 判斷get提交的參數id是否存在 if(isset($_GET['id'])){$id = $_GET['id'];if(preg_match("/or|\+/i",$id)){die("id error");}# 判斷id的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$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> <?php # 包含數據庫連接文件 include("config.php"); # 判斷get提交的參數id是否存在 if(isset($_GET['id'])){$id = $_GET['id'];if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\+/i",$id)){die("id error");}# 判斷id的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$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> <?php # 包含數據庫連接文件 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的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$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> <?php # 包含數據庫連接文件 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的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$conn->close();}}else{highlight_file(__FILE__); }?> </body> <!-- flag in id = 1000 --> </html>關鍵代碼:
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\!|x|hex|\(|\)|\+|select/i",$id))payload:這里過濾了',可以使用^按位異或來繞過
二進制^原理:
例如,使用144^888來繞過
^在數據庫中也可使用,雖然會報錯
第六題
<html> <head><title>ctf.show萌新計劃web1</title><meta charset="utf-8"> </head> <body> <?php # 包含數據庫連接文件 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的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$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> <?php # 包含數據庫連接文件 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的值是否大于999if(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<br>";# 執行sql 語句$result = $conn->query($sql);# 判斷有沒有查詢結果if ($result->num_rows > 0) {# 如果有結果,獲取結果對象的值$rowwhile($row = $result->fetch_assoc()) {echo "id: " . $row["id"]. " - title: " . $row["title"]. " <br><hr>" . $row["content"]. "<br>";}}# 關閉數據庫連接$conn->close();}}else{highlight_file(__FILE__); }?> </body> <!-- flag in id = 1000 --> </html>關鍵代碼:
if(preg_match("/\'|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|\~|x|hex|\(|\)|\+|select/i",$id))palyload:可以使用二進制繞過(0b開頭表示二進制)
二進制在數據庫中也可以使用,0b開頭的數字會自動轉換為數字,例:
注1:數據庫中的數據創建過程:
總結
以上是生活随笔為你收集整理的ctf.show-萌新计划(1-7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php运算符的特殊用法
- 下一篇: 关于徐彦伯的名言名句158个