NoSQL注入小笔记

最近参加了一次线下ctf比赛,水了一个二等奖,题目里面考了一个NoSQL的注入,这种数据库之前也没接触过,多亏了主办方给的提示。为了不辜负主办方的用心良苦,自己也下来专门研究了一下NoSQL,学过之后才发现题目考的内容真的很基础…十分羞愧…


NoSQL介绍:

NoSQL:是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储。现今的计算机体系结构在数据存储方面要求具 备庞大的水平扩 展性,而NoSQL致力于改变这一现状。目前Google的 BigTable 和Amazon 的Dynamo使用的就是NoSQL型数据库。

随着web2.0的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)

NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。在NoSQL概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于web互联网应用。比如cdb、qdbm、bdb数据库。

NOSQL的优势:

易扩展

NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。

大数据量,高性能

NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。

灵活的数据模型

NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web2.0时代尤其明显。

高可用

NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。

NoSQL相关的SQL攻击:

1.重言式。又称为永真式。此类攻击是在条件语句中注入代码,使生成的表达式判定结果永远为真,从而绕过认证或访问机制。比如实际中用$ne操作(不相等)的语法让他们无需相应的凭证即可非法进入系统。

2.联合查询。联合查询是一种众所周知的SQL注入技术,攻击者利用一个脆弱的参数去改变给定查询返回的数据集。联合查询最常用的用法是绕过认证页面获取数据。比如通过增加永真的表达式利用布尔OR运算符进行攻击,从而导致整个语句判定出错,进行非法的数据获取。

3.JavaScript注入。这是一种新的漏洞,由允许执行数据内容中JavaScript的NoSQL数据库引入的。JavaScript使在数据引擎进行复杂事务和查询成为可能。传递不干净的用户输入到这些查询中可以注入任意JavaScript代码,这会导致非法的数据获取或篡改。

4.背负式查询。在背负式查询中,攻击者通过利用转义特定字符(比如像回车和换行之类的结束符)插入由数据库额外执行的查询,这样就可以执行任意代码了。

5.跨域违规。HTTP REST APIs是NoSQL数据库中的一个流行模块,然而,它们引入了一类新的漏洞,它甚至能让攻击者从其他域攻击数据库。在跨域攻击中,攻击者利用合法用户和他们的网页浏览器执行有害的操作。在本文中,我们将展示此类跨站请求伪造(CSRF)攻击形式的违规行为,在此网站信任的用户浏览器将被利用在NoSQL数据库上执行非法操作。通过把HTML格式的代码注入到有漏洞的网站或者欺骗用户进入到攻击者自己的网站上,攻击者可以在目标数据库上执行post动作,从而破坏数据库。

NoSQL MYSQL区别:

nosql的定义是not only sql,包括键值数据库,列式数据库,文本数据库,图形数据库等

mysql是一种传统的关系型数据库。 关系型数据库一般都可以通过sql语句进行操作。sql的语法一般遵循SQL99标准,也就是说上层的应用可以通过同样的sql语句访问不同的数据库。 而nosql对sql的支持并不像关系型数据库一样。以hbase为例,它本身并不支持sql,我们可以通过hbase shell进行操作,上层应用可以通过hbase API读写数据库。但是我们也可以通过hive(hive sql,类sql语法)来访问hbase。还有一些hbase skin(可以理解成hbase客户端),支持了部分sql语法以方便用户使用,比如pheonix。

Nosql注入案例:

使用SQL数据库存储用户名密码的系统,我们检测用户名与密码的过程可能是这样的:

我们使用MongoDB进行最简单的用户名与密码检测可能是这样的:

在最普通的SQL注入中,我们可以构造下面这样的请求:

这个请求会形成这样的SQL语句:

成功注入!

采用同理的方法,针对上面的MongoDB查询方式,你可以构造下面的请求:

这个请求会形成这样的MongoDB查询:

成功注入!

如上案例就是使用重言式,我们也主要介绍一下这种方法,因为这道ctf题就是考这个点

我们使用一个MongoDB示例去演示数组注入漏洞

MongoDB所要求的输入形式是json的格式,例如:

在实际的使用中(PHP环境下),一般是这样使用

对于习惯传统的SQL注入手段的我们来讲,这样的形式很难想到常规的方法去bypass也很难想到办法去构造payload,这种手段就像参数化的SQL语句一样很难注入。

想要找到真的漏洞成因和原理,了解最基础的MongoDB语法是必要的

条件操作符:

比如:

我们发现,在find的参数里,age对应的value设置为数组(这个数组包含特殊的mongoDB特别定义的变量名作为操作符,变量名对应的value作为操作对象)将会起到条件查询的作用。就PHP本身的性质而言,由于其松散的数组特性,导致如果我们输入value=A那么,也就是输入了一个value的值为1的数据。如果输入value[$ne]=2也就意味着value=array($ne=>2),在MongoDB的角度来,很有可能从原来的一个单个目标的查询变成了条件查询($ne表示不等于-not equel): 从

变成了

防御:可以通过函数is_array()将输入参数转变为字符串类型来解决。如:

接下来看一下比赛的题,当时忘截图题目了..不过无所谓..目测各位大佬都是秒杀..

image

ko image


参考资料:

http://www.infoq.com/cn/news/2011/01/nosql-why

https://www.cnblogs.com/wangyayun/p/6598166.html

http://www.freebuf.com/articles/database/95314.html

Hduoj用户AC题数统计爬虫

趁着前几天出去比赛的空余时间瞎写完了

一向写python都是现写现查库怎么用

写这个主要是为了班里统计方便 ,但现在应该用不上了2333

写的挺垃圾,也是第一次搞这个,因为库太好用了感觉自己写的也没啥水平哈哈

其中主要点是判断指定日期的做题AC数

用了下用户实时的提交页面

1.爬下直到指定日期最后所有做题情况

2.判断时间是否符合,顺便学习了下datetime

  •    因为日期是从前往后排所以 大于当前日期的跳过,直到遇见最后日期跳出循环
  •    需要注意的就是如果指定日期加之前这个用户没有答题过 会造成死循环 所以判断下当前是否为最后一页 因为get参数没有页数所以就判断first是否重复就ok

3.判断是否ac

4.丢到dict

 

分享一下渣渣代码

 

 

纪念一下刷的第100道水题

纪念一下本辣鸡在hdu刷的第100道水题,
比较标准的dfs..

Red and Black

Problem Description

There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can’t move on red tiles, he can move only on black tiles.

Write a program to count the number of black tiles which he can reach by repeating the moves described above.

Input

The input consists of multiple data sets. A data set starts with a line containing two positive integers W and H; W and H are the numbers of tiles in the x- and y- directions, respectively. W and H are not more than 20.

There are H more lines in the data set, each of which includes W characters. Each character represents the color of a tile as follows.

‘.’ – a black tile
‘#’ – a red tile
‘@’ – a man on a black tile(appears exactly once in a data set)

Output

For each data set, your program should output a line which contains the number of tiles he can reach from the initial tile (including itself).

Sample Input

6 9
….#.
…..#
……
……
……
……
……
#@…#
.#..#.
11 9
.#………
.#.#######.
.#.#…..#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#…….#.
.#########.
………..
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
…@…
###.###
..#.#..
..#.#..
0 0

Sample Output

45
59
6
13

代码实现

 


Mac下mysql忘记密码后如何重置

今天上课装mysql遇到点坑,老师是用win告的,所以还得自己解决。
坑就是mac上装mysql会自动给个密码,但我一激动没记下来..wtf
然后就是百度了
第一步:
停止mysql服务
然后
第二步:
终端输入cd /usr/local/mysql/bin/
管理权限 sudo su
禁止mysql验证功能 ./mysqld_safe --skip-grant-tables &
第三步:
./mysql
然后
FLUSH PRIVILEGES;
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('你的新密码');
ok

Java中如何控制保留小数位数

Eclipse neon配置tomcat9遇到的坑及解决方法

操作环境:
Mac
Eclipse neon(4.6)
Tomcat 9


遇到的坑:
1. 安装TomcatPlugin报错 无法安装其插件
2. preferences中没有Server选项
3. Server中Runtime Environments没有tomcat9版本 无法配置
(导致jsp程序报错 not found on the Java Build Path)

解决方法:

  1. 安装TomcatPlugin报错 无法安装其插件
    网上的方法是通过http://tomcatplugin.sf.net/update 来安装
    可是事实上也可能是这个Eclipse的版本问题 我们在线安装等半天最后说不行 所以这里采取的最好的方法是通过离线安装
    net.sf.eclipse.tomcat.updatesite-2016-09-21
    (链接:http://pan.baidu.com/s/1pLLWefh 密码:20q8)

    下载好压缩包后解压为文件夹,之后help-install new software-add-local-选择文件夹-然后安装就成功了

    之后在preferences中可以找到tomcat 选择版本为9 选则tomcat的路径 配置完成
    这时候工具栏就会出现tomcat的标志了
    懒得上图了

  2. preferences中没有Server选项
    还是像刚才一样help-install new software-地址栏输入 http://download.eclipse.org/releases/neon
    然后下面那栏搜索JST(J2EE标准工具)下载
    打开preferences就能看到Server选项了
    如果不是这样安装或者用其他网上给的网址安装有可能出现下面这个问题
  3. Server中Runtime Environments没有tomcat9版本 没法配置环境 结果导致jsp程序报错 not found on the Java Build Path
    解决方法其实就是上面 一定要下载新版的插件才能出现tomcat9的选项

    然后记得在创建web程序时选上配置好的这个runtime environments 就不报错啦

java中this调用构造方法与对返回类实例

java中this常用有三种功能分别是:引用成员变量,调用构造方法,返回类实例。第一种功能比较容易理解,实际上也就是防止对象属性与方法中形参名相同。
哦对 顺便说下this的概念:this代表调用这个函数的对象。 其实和python中的self类似。

java中this调用构造方法

使用格式如下:

系统将根据参数列表来决定调用哪一个构造方法。使用this时还需注意下面几点:

  1. 用this调用构造方法时,该语句只能用在构造方法中。
  2. this语句必须是构造方法中的第一条语句。
  3. 和new不同,this虽然可以调用构造方法,但它只是执行构造方法中的语句,并不会创建对象。

(百度网友淡忘WHY66的回答)

举个例子

output:

好的,接下来说

java中this返回类实例

可以理解为返回类的对象,然后…要说的都在下面了..

output:

注意:
被static修饰的方法没有this指针。因为被static修饰的方法是公共的,不能说属于哪个具体的对象的


感谢阅读,如果有错误非常欢迎指出~thx 🙂

java调用包时的问题

如果在同一个包内可以不用import 直接创建对象 比如同包内有一个class内容为

直接这样 或者注释掉第二行都可以调用

但如果还有个包或者子包,他们和上面那个包中有相同的类名时

调用时就需要

才能输出 cn.rui0.cs.Telphone

如果你像下面这样调用 没有明确指明具体是哪个class

则他会首先寻找自己包内有没有这个类,如果有就先调用自己包里的最后输出cn.rui0.Telphone 执行过程就如第一个一样。(如果没有就再调用import了的.cs里的这个类 最后输出的就是cn.rui0.cs.Telphone)像上面这个咱们2已经假设了两个包内有相同的类名的情况,它当然就会输出cn.rui0.Telphone了

so,
如果要调用的类在另一个包或者子包并与这个包中的类名不同,则可以用通配符调用其所有文件或者还是指定文件调用 如下

另一个包中的tclass类

调用该包内其全部文件

这样是可以运行的 并且输出cn.ruilin.tclass

也就是说,你不导入包时程序会自动把本包下的文件导入提供调用,当然你也可以指明调用哪个。
而当导入其他包的类与本包类重名时,不能采用import 包名.*;此时java程序只承认本包下的文件;而应该采用import 包名.文件名,此时java程序只承认由其他包导入的文件。

java中方法与构造方法的理解

初学者可能会搞晕或者是不理解,个人认为要理解并区分方法与构造方法 我们首先应该了解他们的作用,用作用做对比才能方便区分,接下来才是慢慢了解如何使用。


首先先简单了解一下大概作用

  • 方法: 方法是语句的集合,它们在一起执行一个功能。实际上就相当于python或者c中的函数。
  • 构造方法: 构造方法其实就是对类进行里面数据的初始化定义,它是方法中的一种(方法分为三种,接下来会说到),你可以有也可以没有。没有系统会自动给你生成一个无参的。重点也是需要提前强调的是它需要与类名相同。

之后继续说

  • 方法: 一个类中的方法分为三类: 1)全局方法 2) 成员方法 3)构造方法

三者区别:

  1. 成员方法必须构造类的实例化对象进行访问
  2. 全局方法可以用类直接访问
  3. 构造方法是实例化对象时进行初始化的

一般情况下,定义一个方法包含以下语法:

  1. 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
  2. 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
  3. 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  4. 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  5. 方法体:方法体包含具体的语句,定义该方法的功能。

 

  • 构造方法

在创建对象的时候,对象成员可以由构造函数方法进行初始化。

也就是我们创造实例化的代码中 new后面跟的就是构造方法

等号右面

相当于是以Telphone类为模板,在堆空间里创建一个Telphone类对象

末尾的()代表着,在对象创建后,立即调用Telphone类的构造函数,对刚生成的对象进行初始化。

等号左面

创建命名了一个Telphone类引用变量phone

这里用一下imooc的图

image

接下来再说下有参和无参的构造方法的区别

有参就是你可以在创建对象时候赋值

Test为构造方法(函数)名 需要与类名相同 

创建对象

无参就需要这样

创建对象并赋值

总的来说,有参构造函数和无参构造函数都可以提前初始化一些值,但是有参可以在实例化时就进行赋值而无参不可以。这些赋值或者说初始化都是为了后面调用方法(函数)更加方便或者是去提供一些功能所必要的参数来防止报错,这也就是构造方法的作用。

最后再放一个有参的构造方法的例子便于理解

output:

 


以上就是我对java中方法与构造方法的理解与区分,其中也简述了对有参与无参构造方法的一些理解,欢迎交流。