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语句挂上如下
暂时这些吧