欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bugku web题9~16 write up

程序员文章站 2022-03-09 22:52:03
...

bugku web题9~16 write up


域名解析

题目描述:听说把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
bugku web题9~16 write up
不能解析flag.bugku.com为IP 120.24.86.145

120.24.86.145
bugku web题9~16 write up
这里出现了(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注入1

提示:过滤了关键字 你能绕过他吗
打开网页显示部分源码如下:

//过滤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 u<a>nion selec<a>t 1,hash fro<a>m .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:考察抓包


本地包含

打开网页出现源码如下:

 <?php
    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:代码执行漏洞


变量1

打开页面:

flag In the variable ! <?php  

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变量的使用


web5

打开网页,查看源码如图:
bugku web题9~16 write up
发现如高亮部分的代码(不完整)。
题目已经提示了是JSPFUCK。

jspfuck:jspfuck代码是一种合法的Javascript代码,可在大部分浏览器中运行。jspfuck只包含六种字符,黑客在攻击时可以利用他来进行一些绕过。(详情见链接)

一个在线工具

利用在线工具运行,得到flag,记得转为大写。
p:jsfuck


头等舱

页面无线索,网页源码无线索,最后抓包在响应头里看到了flag,回顾题目头等舱应该提示的就是头信息吧。


web4

打开网页源码,发现如下代码:

<script>
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));
</script>

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修改元素


相关标签: bugku