eighth-day

 · 2019-8-7 · 次阅读


24.cookies欺骗http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=
  进入页面后,发现一大长串不知所以然的英文与数字组合,先不管它,F12看一下;无其他可用信息,但我们在URL看到filename后面的filename=a2V5cy50eHQ=应该是个base64加密的,并且前面的line=这后面没有写任何数字,是不是可以看到些什么,先解码那个base64。解码后是keys.txt,改为解码后的试试。为空白页,此时给Line赋值再看看,任无信息,返回最开始链接。直接给Line赋值,任无信息。一般信息存储在Index.php中我们给Index.php base64加密后放filename,再给line赋值试试。发现内容,不断修改line的值可以发现不同的内容。这里应该可以用代码实现,奈何本人能力太差,先手工记录代码,等会儿去寻找代码实现方法。
得到以下代码:
error_reporting(0);
$file=base64_decode(isset($_GET[‘filename’])?$_GET[‘filename’]:””); $line=isset($_GET[‘line’])?intval($_GET[‘line’]):0;
if($file==’’) header(“location:index.php?line=&filename=a2V5cy50eHQ=”);
$file_list = array(
‘0’ =>’keys.txt’,
‘1’ =>’index.php’,
‘1’ =>’index.php’,
);
if(isset($_COOKIE[‘margin’]) && $_COOKIE[‘margin’]==’margin’){
$file_list[2]=’keys.php’;
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
仔细阅读代码,会发现file_list是一个数组,它的0和1分别存的是key.txt和keys.php.此时前面是关于文件名进行了base64加密。最后的两个判断语句很重要,如果设置了cookie[margin]并且cookie-margin的值也为margin时,文件列表数组的2就对应的是keys.php了。最后这个in_array函数不是很熟悉,百度后为:举个例子$people = array(“Bill”, “Steve”, “Mark”, “David”);
if (in_array(“Mark”, $people))
{
echo “匹配已找到”;
}
这是再w3school中看到的实例我也一下理解了,那么之前代码相关意思就是寻找$file是否再file_list数组中,如果在就让fa变量变为整个file文件。并输出对应行数的fa文件内容。也就是说先把filename改为Keys.php的base64的值让后将其cookie的值改为margin应该可以获得keys.php的内容,先试试。因为涉及到修改cookie,这里用BP做,浏览器插件有一些问题。就这样打开了keys.php并获取到里面所有的内容,拿下flag.
  summary:对于这道题,我上课做过类似的因而较为熟悉,但是在审计代码中由于文件部分没有学习导致代码解读不清楚,还有在找出提示代码时由于能力受限进行手工记录代码实属麻烦浪费时间,万一这道题的代码提示过长那岂不是记录代码都花半小时,因而我得赶紧去学习下如何修改url的line的同时记录页面内容。用python的几行代码就可以了,但python我不太懂,但代码我还是能看懂:
import requests
a=30
for i in range(a):
url=”http://120.24.86.145:8002/web11/index.php?line="+str(i)+"&filename=aW5kZXgucGhw"
s=requests.get(url)
print s.text
首先应该是导入了requests包,给a赋值30,这里100都行如果提示代码和提示页面足够多的话,接下来就是先写入url也就是要访问的页面。让line的内容赋值一个数组的值再加上后面filename那一串,并用s来获取整个拼接url的响应,最后输出到s的一个文本上。整串代码很简单,但本机环境异常导致这个requests包无限报错导致无法进行实际操作,所有Python相关待我解决那一些麻烦再统一解决。
25.never give up(http://123.206.87.240:8006/test/hello.php?id=1)
  进入页面后提示永永永远不要放弃,这题没做出来肯定是不会放弃的,看url应该是个sql注入题,先看看f12看哈。发现有个1p.html的注释。我试着打开一下。为什么直接给我跳到新bugku的网页去了,我一脸懵逼,,,,。回去这个提示多半没用。抓包再看看。肯定是无重要信息的直接进行注入吧。先加上’试试。无错误回显。可能是进行了过滤也可能是数字型注入。尝试union注入,各种注入没有用,可能是我能力不够,但是之前那个注释很可疑,不对啊,是不是进行了重定向导致1p.html的内容没给我看,欸我知道了。view-source:这一句直接加在url前即可查看源代码,我去试试,有发现。outword里面又有一个unescape函数,我把上面的大长串代码去解密试试。首先%什么都是url编码,我去查看哈url编码表,%3D%3D是==,一大串大写英文被<–大写英文字母==–>这样的格式很明显是提示信息的base64加密那么去base64解密试试。发现解密后又是一大串%那再一次url解码。
  发现如下代码:
if(!$_GET[‘id’])
{
header(‘Location: hello.php?id=1’);
exit();
}
$id=$_GET[‘id’];
$a=$_GET[‘a’];
$b=$_GET[‘b’];
if(stripos($a,’.’))
{
echo ‘no no no no no no no’;
return ;
}
$data = @file_get_contents($a,’r’);
if($data==”bugku is a nice plateform!” and $id==0 and strlen($b)>5 and eregi(“111”.substr($b,0,1),”1114”) and substr($b,0,1)!=4)
{
require(“f4l2a3g.txt”);
}
else
{
print “never never never give up !!!”;
}
  第一小部分代码就是之前sql注入的坑,只要修改了id都会重定向原页面。然后是id,a,b的值都以get方式得到,关于这个stripos函数,我又去找了一个学习实例查找 “php” 在字符串中第一次出现的位置:
(返回在另一字符串中第一次出现的位置,如果没有找到返回FALSE)
根据这个实例那么上面代码的意思就是寻找.在$a中第一次出现的位置,找到了输出no no no;下面是给$data赋予读取$a中文件的成分。如果data的值为bugku is a nice plateform! 并且id=0以及b的长度大于5,substr的理解:echo substr(“Hello world”,0,10).”
“;
这儿输出为Hello worl因而还需满足b字符串的第一二位不能为4,然后还需要检查1114中必须要有111和substr($b,0,1)这样的字符串。这个满足的条件需求有点多啊。
  理一下思路,首先要给a传参数为bugku is a……然后id要为0并且b的长度要大于5.。。等一下require(“f4l2a3g.txt”);这个txt存的就是flag吧,要满足这么多条件。我直接打开试试,获得flag……………………
  summary:出题人是来搞我心态的,说句老实话,我还一直想这条件该怎么满足呢,分析一大堆,然后直接给出了flag,wocao,这题总的来说还算顺利中间遇到了些小坎坷,虽然这道题最后得到flag没有靠构造什么,对代码的解析也不需要很深入,但我任然发现自己的读代码能力不行,还是php学的太差,下学期php课程好好学学哈哈。。这道题就先到这了。