写在前面:
简单步骤不再复现,只是再复习一下知识点,可以挖深一点。
F12
F12改html
? & hackbar
很多解法
1加一个符号就行了
F12,发现一串密文,Unicode解码
我们百度这个是什么意思
是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。
互联网中的地址是数字的IP地址,域名解析的作用主要就是为了便于记忆。
我们知道我们的网址是192.xxx.xxx.xx这种形式,那为什么我们能用www.baidu.com呢,就是绑定了。
百度搜索,如何将域名解析到本机。
抓包,多go几次就看到了、
崩了
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);");
}
?>
最后一句话的意思是打印出我们要的传进去的值作为变量名
大概意思是,
?args=1
那就打印 $1
?args=dqw
那就打印 $dqw
初步想法是传flag,但是不可能让你那么简单就拿到啊对吧。
这里是引用$GLOBALS
$GLOBALS — 引用全局作用域中可用的全部变量
说明
一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
JSFUCK解码
丢到F12里面执行
抓包
扫后台,抓包,爆破
这题很鬼,网页源代码的很下面有个base64加密的东西,解密是test123,然后uesr=admin,pass=test123还是错,说IP不行,那就加本地头,X-Forwarded-For=127.0.0.1通过
看源代码很容易看懂,就一个escape加密。解密出来为一串函数
function checkSubmit() {
var a = document.getElementById("password");
if ("undefined" != typeof a) {
if ("67d709b2b54aa2aa648cf6e87a7114f1" == a.value)
return !0;
alert("Error");
a.focus();
return !1
}
}
document.getElementById("levelQuest").onsubmit = checkSubmit;
很简单了复制粘贴就好
伪协议读取源码
?file=php://filter/convert.base64-encode/resource=index.php
解码
纯爆破
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 = $(' +
'+ clicks + '" hidden/>' +
'');
$('body').append(form);
form.submit();
}
});
});
看到这个源码,有个mousedown和up,点击一下clicks加一,然后有个from表单,有一个hidden的post,可以通过post clicks的值改变clicks,那就hackbar
看到备份,看到一串不知道是啥的东西长得像16进制但是转换不出来。
尝试index.php~和index.php.bak,存在bak,打开
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";
}
?>
看源码我们分析,
1、是有一个replace,会把key代替成后面的空白
2、md5相等
两个知识点,一个是绕过字符过滤,一个是md5的0E相等
空白用双写绕过,0E相等直接百度。
?kekeyy1=s878926199a&kekeyy2=s155964671a
最简单的注入
测试发现是单引号注入
order by,table columns 再到字段
这里有一个奇怪的地方,就是order by 能回显四段,但是我怎么放都只能在最后一个地方回显
我觉得下面这个大佬的wp最好了
import requests
import re
url="http://123.206.87.240:8002/qiumingshan/"
r=requests.session()
text=r.get(url).text #将get到的数据以文本形式显示出来
cont=re.findall('(.*?)',text) #匹配出计算表达式,返回的是列表
cont="".join(cont) #列表转字符串,因为eval()接收的参数类型为string, bytes or code object
cont=cont[:-3] #删掉多余的字符
post=eval(cont) #eval()可以把字符串当做有效表达式进行计算
data={'value':post} #构造post数据
ans=r.post(url,data=data)
print(ans.text)
F12,看到内容post一个margin,抓包,发现responds里面有flag的base64,但是每次都会变化,而且后面能再解码,我们可以知道,这个应该就是所谓的margin。上脚本。
import requests
import re
import base64
url="http://123.206.87.240:8002/web6/"
r=requests.session()
headers=r.get(url).headers#在header而不是text
print(headers)
cont = base64.b64decode(headers['flag'])
cont= base64.b64decode(str(cont).split(':')[1])
print(cont)
data= {'margin':cont}
flag = r.post("http://123.206.87.240:8002/web6/",data=data)
print(flag.text)
进去,一堆乱英文,看到url,有个base64,解码是keys.txt。行数没用,那就估计可能在flag.php或者index.php里面,将index.php加密,放到url上面,改行数,出来源码,一个个找,也可以写脚本找
import re
import requests
for i in range(1,30):
url='http://123.206.87.240:8002/web11/index.php?line='+str(i)+'&filename=aW5kZXgucGhw'
r=requests.session()
text=r.get(url).text
print(text)
index.php内容
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=margin,然后才能访问keys.php
开始看到一个id=,还以为是注入,看源码发现有个注释,1P.html
进去发现跳转到了bugku论坛首页,看来有个跳转,那就抓包试试,算了懒得抓包了,直接在前面加一个view-source
一串base64,解密看到代码
";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 !!!";
}
?>
看到这个东西我们先尝试一下能不能访问那个txt,当然这属于偷鸡,好的,可以
很熟悉了,伪协议post $data,弱类型相等,%00截断
id=q,a=php://input,b=%00qweqew
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
开始的/和结束的/,正则表达式标志
.代表数字匹配任意数字,*代表匹配0-n次两者结合.*就是匹配任一个数字任意次
\表示后面的那个字符,而不是代表其他意义的
{4,7}表示匹配前一个字符4到7次
[a-z]就是匹配a-z之间的字符
[[:punct:]]匹配任意标点
/i (忽略大小写)
wp:?id=key1key22222key:/3/keya]
右键源码,code.txt
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;
}
}
}
?>
md5 0e相等,strcmp函数漏洞
hint 约束攻击,百度
注册加空格
扫描后台,莫名其妙干扰
看到from google,想到请求头
HTTP_REFERER 编辑 HTTP
Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,
告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。 简而言之,HTTP
Referer是header的一部分,当浏览器向web服务器发送请求的时候, 一般会带上Referer,告诉服务器我是从哪个页面链接过来的
现在没内容了,在南邮有,那就到时在南邮wp再写
本地访问
X-Forwarded-For:127.0.0.1
sha1碰撞,可以直接传数组然后返回0就满足条件了,也可以百度sha1碰撞
ac不为空,有一个熟悉的伪协议应用,f没有接口
?ac=1&fn=php://input post1
hint:变成admin,开始想可能是改什么cookie或者能改的
抓包,没用,扫后台,发现robots.txt,进去发现有一个php,进去
看到一句话,if (_GET[x]==$password)
联想到提示,那就x=admin吧
这题有点不懂原理,本来以为用%00上传木马然后连接,但是失败了
1、Content-Type 中,方式把部分字母改成大写绕过
2、黑名单白名单,这里尝试php5,绕过成功
error_reporting(0);
function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];
}
$host="localhost";
$user="";
$pass="";
$db="";
$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");
mysql_select_db($db) or die("Unable to select database");
$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);
难,未来填坑,暂时没心情做新题