SQL注入篇(2)
手工注入基本流程:(有回显情况)
1:判断是否有注入点
输入内容的长度是否超出了字段定义长度,如果超过可能存在注入点;
输入内容是否包含特殊字符,例如’、"、;等,如果包含可能存在注入点;
输入内容是否被过滤,如果被过滤可能存在注入点;
是否存在动态拼接SQL语句的情况,如果存在可能存在注入点。
2:猜解 列名数量
order by 数量
3:报错判断回显点
union (合并查询函数/联合查询)通过前面语句报错突出后面的回显点
4:信息收集
回显点处配合其他语句查询自己想知道的内容
数据库版本 :version();高版本才有系统库 {高版本5.0以上 低版本5.0以下};
数据库名:database()
5:使用sql语句进行注入
通过database()得 数据库名:security;在infromation_schema.tables ;查表名 {表名存在table_name里}
sqly语句: union select 1,group_concat(table_name),3 from information_schema.tables where table_schema ='security'
语句整体意思是:查找在security库里的infromation_schema.tables里查table_name
sql语句解析:利用union写第二个语句、在回显点处查需要的东西
group_concat() :去重连接
6:补充知识点:
一个库有很多表
infromation_schema 库里有schemata表【库里有所有数据库信息】;
tables表【所有表信息】表名查询写法:select table_name;
columns表【所有列信息】列名查询写法:select columns_name;
言归正传,既然知道了表名就可以通过语句查列名,语句如下:
sql语句:union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'
解析:查询列名在information_schema.columns 条件是表名是users
查出来回显位置显示 username password 等等很多列名,那么就可根据列名查出存在的用户名密码
sql语句:union select 1,2,group_concat(username,password) from users
解析:利用union 再回显位置查询所有用户名和密码。