SQL注入之显错注入

MySQL基础知识

系统自带库information_schema中存在tables表和columns表,我们可以通过这两个表查询相关信息

distinct 关键字,distinct用于去除查询中的重复,可以用information_schema.tables中的TABLE_SCHEMA字段查询出所有库信息

group_concat()函数,此函数只有MySQL中存在,作用是把查询出的内容通过逗号连接起来

GET型显错注入


1、单引号字符型显错注入

此处用sqli-labs学习

字符型,假设传参为id=1,那么在数据库中这个传参的类型为字符型,SQL语句大概是

SELECT * FROM 表名 WHERE id='1' limit 0,1

如下图,当id=1时,页面正常返回

添加单引号,页面报错

此时的报错是由于,用户在输入了单引号后,网站后台未对用户输入进行过滤,使得单引号带入SQL语句执行,语句如下

SELECT * FROM 表名 WHERE id='1'' limit 0,1

这就需要闭合原来的语句,需要用到注释符号--+,如下图

在单引号和注释符号之间就是我们的操作空间,先通过order by语句判断字段数,如果order by 3,页面显示正常,order by 4页面异常说明存在3个字段,此处有三个字段不再上图

判断回显点,通过联合查询判断回显点,如下图

可以看到2、3字段回显,接下来就可以再相应的位置查询我们想要获得的数据,比如database()查询数据库名称

查询所有库信息,此处注意2、3字段回显,在3出可直接跟拼接的语句,如union select 1,2,user from admin,但是在2处,需要使用子查询

' and 1=2 union select 1,(select group_concat(distinct TABLE_SCHEMA) from information_schema.tables)--+

结果如下

接下来通过tables表查询table名,语句为

'and 1=2 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='test'),3--+

通过columns表查询字段名称,语句为

'and 1=2 union select 1,(select group_concat(column_name) from information_schema.columns where table_name='test'),3--+

数据库中可能存在表名重复,如果出现这种情况,可在查询语句后面加限制条件,下面具体查询数据不在一一列出

2、双引号字符型显错注入

单引号字符型与双引号字符型的区别就在于,闭合原有的SQL语句的时候需要使用"--+,在双引号与注释符号之间就是我们的操作空间。

其余步骤与单引号字符型一致。

3、字符变型显错注入

在一些查询语句中可能会出现,id=('1')或者(id='1')的情况,这个时候闭合原有语句就需要使用')--+

4、整形显错注入

整形显错注入建议使用-1来观察页面变化,某些情况下直接输入order by 会报错,这是因为原有语句中已经存在了order by,只需要加上注释符号即可

5、base64变形注入

通过谷歌语法,inurl:.php?id=MTM intext:公司 就可以找到很多注入点,这类注入点需要对我们输入的语句进行base64编码即可


POST型显错注入


1、登录框处post注入

登录框一般都是采用post方法传输数据,如果此处未对用户输入进行过滤,那么此处存在注入,根据不同的查询语句,可能会存在万能密码登录,打开post靶场如下

用户名和密码是admin和admin,添加单引号

此处需要添加#做注释,#是MySQL中特有的注释符号,密码可以随便输入,可成功登录,如下

判断字段数,也是通过order by 判断,此处为2个字段

判断回显点,如下

获取数据,输入database(),获取数据库名称

其他测试步骤与GET型一致

2、其他位置post注入

其他位置的post注入原理与登录框一致,例如

搜索框处的post注入、留言模块处的post注入、个人资料处的post注入

3、扩展

如果登录框处无法通过#或者--+来闭合原有语句,在有报错的情况下可构建其他语句闭合原语句,如下

此处登录框的查询语法大概是

SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1

这种语句可以进行注入,也可以直接万能密码登录

还有一种情况就是,如下

SELECT password FROM users WHERE username='$uname' LIMIT 0,1

然后通过代码对查询到的数据与前台传来的数据进行比对,如果一致则登录成功,不一致则失败

这种可尝试SQL注入,但可能无法使用万能密码,因为or 1=1 会查询出所有的password字段,如果只有一个账户,还可以尝试,多个账户的话,也会返回多个,如下

SQL注入的话,登录不成功,可以尝试DNS带外查询,当然直接union select 1,然后password输入1,也可能出现一些神奇的事情,还没遇到过,暂时不写了,SQL语句挂上如下

暂时这些吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值