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 lumns 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,添加单引号
distinct查询
此处需要添加#做注释,#是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语句挂上如下
暂时这些吧

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。