十一、sql閉合繞過(guò)
<?php
if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("*******", "****", "****");
mysql_select_db("****") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$user = $_POST[user];
$pass = md5($_POST[pass]);
//select user from php where (user='admin')#
//exp:admin')#
$sql = "select user from php where (user='$user') and (pw='$pass')";
$query = mysql_query($sql);
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];
if($row['user']=="admin") {
echo "<p>Logged in! Key: *********** </p>";
}
if($row['user'] != "admin") {
echo("<p>You are not admin!</p>");
}
}
?>
很簡(jiǎn)單的登陸sql閉合繞過(guò),閉合掉'和)然后將后面的東西注釋掉。payload:admin')#
十二、X-Forwarded-For繞過(guò)指定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 "錯(cuò)誤!你的IP不在訪問(wèn)列表之內(nèi)!";
}
?>
如果HTTP_CLIENT_IP不存在就使用HTTP_X_FORWARDED_FOR獲取ip,如果也不存在就使用REMOTE_ADDR獲取ip。
REMOTE_ADDR是比較靠譜的獲取ip的方式,無(wú)法通過(guò)http請(qǐng)求頭偽裝。HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR都可以通過(guò)偽造請(qǐng)求頭偽裝,只要合適使用http請(qǐng)求頭就可以使$GetIPs=="1.1.1.1"。這里可以HTTP頭添加X-Forwarded-For:1.1.1.1
十三、md5加密相等繞過(guò)
<?php
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
?>
這道題的問(wèn)題在于$md51 == $md52這里使用的使==而不是===。
==對(duì)比的時(shí)候會(huì)進(jìn)行數(shù)據(jù)轉(zhuǎn)換,0eXXXXXXXXXX 轉(zhuǎn)成0了(科學(xué)記數(shù)法)。QNKCDZO的md5值為0e830400451993494058024219903391,只要再找一個(gè)加密后0e開(kāi)頭的字符串就好,可以寫(xiě)個(gè)小程序跑一下,這里用?a=240610708240610708的md5值為0e462097431906509019562988736854。
十四、intval函數(shù)四舍五入
<?php
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]);
$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
if ($_GET[id]==1024) {
echo "<p>no! try again</p>";
}
else{
echo($query[content]);
}
}
?>
intval() 函數(shù)通過(guò)使用指定的進(jìn)制 base 轉(zhuǎn)換(默認(rèn)是十進(jìn)制),返回變量 var 的 integer 數(shù)值。 intval() 不能用于 object,否則會(huì)產(chǎn)生 E_NOTICE 錯(cuò)誤并返回 1。
這個(gè)題為啥叫四舍五入不是很懂,intval()函數(shù)不是直接去掉小數(shù)位嗎?這里繞過(guò)也很容易直接id=1024.1就可以了,這樣$_GET[id]不等于1024而intval($_GET[id])等于1024
十五、strpos數(shù)組繞過(guò)NULL與ereg正則%00截?cái)?/h1>
<?php
$flag = "flag";
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必須輸入數(shù)字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '騷年,繼續(xù)努力吧啊~';
}
?>
方法一 %00截?cái)?ereg()可以被%00截?cái)啵ㄔ斠?jiàn)例五)
<?php
$flag = "flag";
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必須輸入數(shù)字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '騷年,繼續(xù)努力吧啊~';
}
?>
使用%00截?cái)嗪蠹由?code>#biubiubiu,payload:?nctf=1%00#biubiubiu
方法二 strpos(),ereg()出錯(cuò)返回null
當(dāng)輸入數(shù)組strpos(),ereg()出錯(cuò)返回null,又因?yàn)閚ull!==false,所以可以滿足條件返回flag,payload:?nctf[]=