0x00 背景
学习记录一下报错型的注入,经各方整理和自己总结形成。

所有的注入原理都是一样,即用户输入被拼接执行。但后台数据库执行语句产生错误并回显到页面时即可能存在报错注入。

0x01概念
报错型注入的利用大概有以下3种方式:

复制代码
1:?id=2’ and (select 1 from (select count(*),concat( floor(rand(0)*2),(select (select (查询语句))
from information_schema.tables limit 0,1))x from information_schema.tables group by x )a )–+
2:?id=2’ and updatexml(1,concat(0x7e,(SELECT 查询语句),0x7e),1)–+
3:?id=1’ and extractvalue(1, concat(0x7e, (select 查询语句),0x7e))–+
复制代码
对于1的分析:

复制代码
floor()是取整数 rand(0)*2将取0到2的随机数
floor(rand()2)有两条记录就会报错
floor(rand(0)
2)记录需为3条以上,且3条以上必报错,返回的值是有规律的
count()是用来统计结果的,相当于刷新一次结果
group by 对数据分组时会先看看虚拟表里有没有这个值,若没有就插入,若存在则count()加1
group by 时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次
对于count()、rand()、group by 三者同时存在为什么会报错可以参考乌云tsafe的文章
复制代码
对于2的分析:

复制代码
函数的形式为:UPDATEXML (XML_document, XPath_string, new_value);、
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值,即改变XML_document中符合XPATH_string的值
而我们的注入语句为:updatexml(1,concat(0x7e,(SELECT 查询语句),0x7e),1)
concat()函数是将其参数连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误导致错误信息返回。
复制代码
对于3的分析:

复制代码
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串).
作用:从目标XML中返回包含所查询值的字符串

而我们的注入语句为:extractvalue(1, concat(0x7e, (select 查询语句),0x7e))
同2一样因为不符合XPATH_string的格式所以会报错
复制代码
0x03 实践
以sqli lab作为测试

?id=1’时:

?id=1’%23时:

带入上面的payload:

可以看到通过xmlupdate成功通过报错信息将数据库名显示出来了,接下来再依次按照求表、列的步骤进行

0x04 CTF实例
i春秋百度杯十月VId

这里省略信息收集,直接到SQL注入的部分

这里只有一个登录框,贴出源代码:

复制代码
1 <?php
2
3 require_once ‘dbmysql.class.php’;
4 require_once ‘config.inc.php’;
5
6 if(isset(KaTeX parse error: Expected 'EOF', got '&' at position 20: …T['username']) &̲& isset(_POST[‘password’]) && isset($_POST[‘number’])){
7 $db = new mysql_db();
8 $username = db−>safedata(db->safe_data(db−>safed​ata(_POST[‘username’]);
9 $password = db−>mymd5(db->my_md5(db−>mym​d5(_POST[‘password’]);
10 number=isnumeric(number = is_numeric(number=isn​umeric(_POST[‘number’]) ? $_POST[‘number’] : 1;
11
12 username=trim(strreplace(username = trim(str_replace(username=trim(strr​eplace(number, ‘’, $username));
13
14 sql="select∗from"."‘".tablename."‘"."whereusername="."′"."sql = "select * from"."`".table_name."`"."where username="."'"."sql="select∗from"."‘".tablen​ame."‘"."whereusername="."′"."username"."’";
15 $row = db−>query(db->query(db−>query(sql);
16 $result = db−>fetcharray(db->fetch_array(db−>fetcha​rray(row);
17 if(KaTeX parse error: Expected '}', got 'EOF' at end of input: … 18 if(result[“number”] === $number && $result[“password”] === $password){
19 echo “";
40 }
41 ?>
复制代码
safe_data()定义:

1 public function safe_data(KaTeX parse error: Expected '}', got 'EOF' at end of input: … stripcslashes(value);
4 }
5 return addslashes($value);
6 }

username在被传入之后首先被safe_data()转义,再被str_replace()处理去掉里面包含的number数字和空格,最后执行sql查询。在这里sql查询语句虽然也有拼接输入,但是需要闭合掉单引号。可是username在一开始加上单引号的话在被传入的时候就会被加上反斜杠。

读了i春秋论坛的writeup才明白可以这样构造:

Number=0&username=test%00’%23
Username经过转义变成test\0\’%23
然后替换操作 变成 test\’%23
单引号逃逸出去,同时因为用了trim所以不能使用空格来分割字段,可以使用+来连接。
最后构造的username为:

username=admin%00’+and+updatexml(1,concat(1,(select+*+from+flag+limit+1),1),1)%23
这里只能获取32位长度,要想获取完整的flag还需使用substr函数

0x05总结
这里只用了updatexml作为例子,其余2个原理都是一样的。

同时对于sqli lab的练习使用这一类注入手工速度很慢,接下来可以考虑写一个自动化的脚本。

sqlmap报错注入相关推荐

  1. SQL注入-盲注-时间注入-报错注入-布尔盲注-DNSlog注入-宽字节注入-WAF绕过-SqlMap使用

    Sqli-labs的安装 1.安装WAMP http://www.wampserver.com/ WAMP是php + mysql + Apache环境集成工具 2.下载Sqli-labs https ...

  2. SQL注入之联合查询、报错注入和sqlmap

    文章目录 SQL注入的方法 方法一:联合查询 方法二:报错注入 extractvalue() 函数 updatexml()函数 方法三:Sqlmap SQL注入即是指web应用程序对用户输入数据的合法 ...

  3. SQL注入 1-3_基于post报错注入

    ** SQL注入 1-3_基于post报错注入 ** 一.概念 客户端提交参数基于post 1.基于post注入不会拼接到url 2.相对get提交参数更加安全 3.但是依然可以使用代理(中间人)截断 ...

  4. 注入双括号报错注入_SQL手动注入:sqlilabs(less110)

    种一棵树最好的时间是10年前,其次是现在. 忘了是谁 前言 说实话,由于前段时间学 python ,对于 OWASP TOP10 漏洞的学习都有所落下,虽然现在也在慢慢复习当中,但是今晚谈及的 SQL ...

  5. 05_SQL注入_功能语句报错注入盲注

    05_SQL注入_功能语句&报错回显&盲注 1. SQL 语句和网站功能 1.1 Web开发中常见语句 [本章代码来源于pikachu和sqli-lab中的靶场] 开发中,根据不同的需 ...

  6. [WEB攻防] i春秋- “百度杯”CTF比赛 十二月场-YeserCMS cmseasy CmsEasy_5.6_20151009 无限制报错注入 复现过程

    中华人民共和国网络安全法(出版物)_360百科 可以说一道经典的CTF题目,解这道题的过程类似于我们渗透测试的过程,所以把它放在了这个专栏,在这里我们详细讲过程,而不是原理. 目录 题目 寻找方向 f ...

  7. mysql报错注入原理,MySQL报错注入

    什么是报错注入 SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果可以出现在错误信息中.我一位好友的博客写过一个SQL注入的专栏,除了报错注入以外,别的类型也写了,而且比较详细, ...

  8. SQL注入之时间盲注 和 报错注入(sql-lab第一关为例)

    什么是时间盲注 时间盲注指通过页面执行的时间来判断数据内容的注入方式,通常用于数据(包含逻辑型)不能返回到页面中的场景,无法利用页面回显判断数据内容,只能通过执行的时间来获取数据. 时间盲注的过程 1 ...

  9. SQL注入——报错注入

    0x00 背景 SQL注入长期位于OWASP TOP10 榜首,对Web 安全有着很大的影响,黑客们往往在注入过程中根据错误回显进行判断,但是现在非常多的Web程序没有正常的错误回显,这样就需要我们利 ...

最新文章

  1. VIM 必知必会12大类型操作
  2. Alyona and a tree (树上倍增+差分)
  3. 计算机控制学什么,计算机控制技术专业介绍
  4. 收集17句经典程序员口头禅
  5. html ie 版本设置密码,如何给IE浏览器设置一个密码的详细图文步骤
  6. windows sdk 学习笔记(8)
  7. 假新闻无处不在:我开源了一个深度学习标记假新闻项目
  8. JS报错: Uncaught SyntaxError: Invalid shorthand property initializer
  9. c++有关iostream和iostream.h
  10. Bsphp验证系统,免费网络验证系统
  11. thinkbook15快捷键
  12. 第一章:机器学习概览
  13. 腾讯企业邮箱只能接受消息不能发送
  14. 【echarts柱状图保存为图片并下载】
  15. 微信公众号客服系统怎么实现消息提醒,快速回复粉丝留言?
  16. 2020-10-19(JS收官答题卡)
  17. 【Pygame实战】打扑克牌嘛?赢了输了?这款打牌游戏,竟让我废寝忘食。
  18. 详解ISO13400文档-2
  19. Excel 文件的生成与下载
  20. Behavior Designer 干货总结

热门文章

  1. 零基础学Python(第六章 if条件语句)
  2. 判断当前时间是否在某个时间范围内
  3. ORA-01123:无法启动联机备份;未启用介质恢复(错误分析)
  4. phpstorm知识点
  5. day16前端(Dom+Jquery)
  6. ExtJS4为form表单必填项添加红色*标识
  7. 【Unity3D技巧】一个简单的Unity-UI框架的实现
  8. 每一对顶点之间的最短路径
  9. 分块读取Blob字段数据(Oracle)
  10. pandas中drop用法_pandas中drop()函数用法