SQL注入必备基础知识
初学SQL注入的小白,整理一下必备的一些基础知识,如有不如或者错误请指出。
注释符
- 单行注释: - -
- 多行注释:/* … */
在sql-labs中,经常使用- - +放在最后注释多余部分
WHERE 子句
如果只希望选取居住在西安中的人,我们需要向select语句添加where子句:
select * from persons where city=‘xi’an’
SELECT查询
- select 列名 from 表名
- select * from 表名
如果把一个学校比作数据库,那么年级就是表名,班级就是列名,意思就是从某年级查看一下某班级。
例如:
select column_name from table_name
查字段数(ORDER BY)
order by 语句用于根据指定的列对结果集进行排序,order by语句默认按照升序对记录进行排序,如果您希望按照降序对记录进行排序。
在sql-labs中,因为union前面列数必须一致,我们必须找出实际列数。这里我们使用了order by,因为order by 排序列数多于实际列数会报错。
假设这里有一个包含SQL注入漏洞的URL,它会将HTTP GET方法中名为“order”的参数的值(该值由用户指定)传递给SQL查询。该URL如下所示:
http://xxx/.asp?data=yes&order=column_name
然后,应用程序会从HTTP GET方法的参数“order”中接收用户提供的数据,并生成如下所示的SQL查询:
Select table_name,column_name from information_schema.columns order by column_name
分组(GREAT BY)
great by :great表示分组,by后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,great by比较类似Excel里面的透视表。
great by必须得配合聚合函数来用,分组之后你可以计数(count),求和(sum),求平均数(avg)等。
例如:
select column_name, aggregate_function(column_name) from table_name where column_name operator value order by column_name
合并语句(UNION)
union用于合并两个或多个select语句,而且union内部的select必须有相同数量的列,列有相似的数据类型,简单的说就是它内部列的属性相同,要么都是数字型,要么都是字符型。
例如:
select column_name from table_name1
union
select column_name from table_name2
连接字符(CONCAT)
concat用于将两个字符连为一个字符串,返回结果为连接产生的字符串,如有任何一个参数为NULL(空),则返回值为NULL(空)。
例如:
select concat (admin,passward) from … where …
延时函数(SLEEP)
select sleep (N) 可以让语句运行N秒钟
sleep可以强制产生一个固定的延迟
例如:
id=1 and sleep(5) //判断下是否存在延时注入,若5秒钟页面返回则存在。
COUNT函数
COUNT() 函数返回匹配指定条件的行数。
例如:
select count (column_name)from table_name //返回指定列的值的数目
select count (*)from table_name //返回表中的值的数目