0%

原理

SQL注入的原理来说,其实还是很简单的,首先先来一段php代码:

1
2
3
4
5
6
<?php
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE user_id = '$id'";
$result = mysql_query($sql) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
?>

就是获取用户传过来的id的值,然后到数据库里去找。比如URL栏里输入的是example.com/?id=1,那么构造的查询语句就变成了:

1
SELECT * FROM users WHERE user_id = '1'

因为id是由我们来进行控制的,所以就可以构造诸如 ' or '1' ='1 来进行注入。实际上构造的是下面这样的:

1
SELECT * FROM users WHERE user_id = '' or '1' ='1'
阅读全文 »

设计模式三大分类

1570846061126

创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程。

结构型模式:把类或对象结合在一起形成一个更大的结构。

行为型模式:类和对象如何交互,及划分责任和算法。

阅读全文 »

平常CDN这个名词听得不少,但是具体的没有深究过,这里就简单了解下。

什么是CDN

CDN是Content Delivery Network 的缩写,即“内容分发网络”。

CDN的作用

假设你的服务器架设在美国,上面运行了一个购物网站,然后你在中国的机器上想要访问这个购物网站,那么客户端就会向服务器请求所有的资源,包括图片等。但是由于实在太远了,经过中间一层又一层设备的损耗,可能中间的耗时高达几百毫秒甚至几秒,这是无法忍受的。CDN的作用就是在中国帮你也部署一台服务器,然后这台服务器上面会保存一些不怎么会变动的内容,比如图片、视频等,这样当你需要请求图片的时候就只需要向中国的服务器请求即可,不再需要去美国那台服务器要了。所以这里又诞生了一个新的问题:既然是CDN的服务器给你的内容,它是怎么做到的呢?

阅读全文 »

最近打算购置一台台式机,自己购买配件然后进行组装,同时也是对计算机组成原理的一次小小复习吧。

基本结构

1570504168537

冯诺依曼体系结构的其中一条说到:计算机硬件由运算器控制器存储器输入设备输出设备五大部分组成。

而对应到现在装机所需要购买的硬件,就有了如下的对应关系:

  • 运算器 + 控制器 = CPU
  • 存储器 = 硬盘
  • 输入设备 = 键盘、鼠标
  • 输出设备 = 屏幕

但是现代计算机,比如为了能够CPU更好地工作,我们还需要内存来提供缓存的功能;同时为了能够运行大型游戏,我们需要单独的显卡来进行图形计算。除此之外,还需要一个机箱来装下这些部件,一块主板来提供元器件之间的沟通以及提供网卡声卡等的支持,若干个散热器来提供良好的散热。

阅读全文 »

什么是反射?

The name reflection is used to describe code which is able to inspect other code in the same system (or itself).

反射这个词,用来描述那些能够检查代码的那些代码。

For example, say you have an object of an unknown type in Java, and you would like to call a ‘doSomething’ method on it if one exists. Java’s static typing system isn’t really designed to support this unless the object conforms to a known interface, but using reflection, your code can look at the object and find out if it has a method called ‘doSomething’ and then call it if you want to.

假设现在你有一个对象,但是你不知道它的类型,然而你却想要调用它的一些方法。原本的java并不能实现这个功能,但是有了反射,你就可以了。

简单来说,反射就是在程序运行的时候(注意是运行的时候!)获得一个类的属性和方法、或者在运行的时候动态创建一个类。

听着是不是还是有点不知所以,那我现在问你,如何编写一个方法来知道一个类里面有多少方法呢?这个普通的代码是无法做到的,但是依靠反射可以很简单完成。

那么反射有什么好处呢?

  • 在运行时判断类的一些信息
  • 在运行时构造新的类
  • 在运行时调用类的方法(甚至是private的)

那么反射有什么坏处呢?

  • 运行慢
阅读全文 »

定义

跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言

三种XSS

反射型实例

1
2
3
4
5
6
7
8
<form action="" method="get">  
<input type="text" name="xss"/>
<input type="submit" value="submit"/>
</form>
<?php
$xss = @$_GET['xss'];
echo $xss;
?>

一个最简单的例子,整个页面就是一个表单,当点击之后就会提交一个值给本页面,然后php代码会把你提交的内容显示出来,所以只需要在框框里输入<script>alert(1)</script>就可以了(PS:请不要使用chrome),然后查看一下源码:

1
2
3
4
5
<form action="" method="get">  
<input type="text" name="xss"/>
<input type="submit" value="submit"/>
</form>
<script>alert(1)</script>

非常容易理解吧?也就是本质上就是你的输入,被浏览器当成了代码执行了。当时我在学习这部分的时候,最不能理解的是,这能有什么危害呢?我自己输入的变成了代码,那我相当于我自己害自己么?我肯定不会这么做的,那么XSS能有什么危害呢?其实这主要是这个例子仅仅是为了说明XSS的原理,所以导致我有这样的错觉。

现在举一个能造成破坏的例子。假设你经常访问一个网站(假设为xss.com),这个网站有XSS漏洞,有黑客知道了你经常访问的网站存在XSS漏洞,然后他构造了一个恶意的网站(假设为trap.com),上面分别有两个页面,一个页面单纯用来把发送给它的信息发送到指定邮箱,还有一个页面用来调用这个发邮件的页面。

阅读全文 »

之前在网上找了一个用来薅羊毛的脚本,ssh连接上服务器之后开始运行脚本,但是如果你logout一下退出了shell,那其实这个脚本是不会继续运行的。之后去网上找了一下,只需要如此运行即可nohup your-script.sh &,这样就算你退出了shell也不会影响脚本的执行,今天有空就来稍微整理一下这其中的原理。

前台和后台任务

首先我自己写了一个每隔一秒输出当前时间的python脚本和bash脚本,用来作为测试

Python:

1
2
3
4
5
6
7
8
#!/usr/bin/env python
# -*- coding=utf-8 -*-
import datetime
import time
while True:
now_time = datetime.datetime.now()
print("time = " + now_time.strftime('%Y.%m.%d-%H:%M:%S'))
time.sleep(1)

Bash:

1
2
3
4
5
6
7
8
#!/bin/bash
# this script is used to print time every second

while [ true ]; do
/bin/sleep 1
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "${time}"
done
阅读全文 »

参考

http://tech.dianwoda.com/2018/12/20/arthasyuan-ma-fen-xi/

https://zhuanlan.zhihu.com/p/53984185

项目结构

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
.
├── CONTRIBUTING.md //贡献者相关信息
├── Dockerfile //Dockerfile
├── Dockerfile-No-Jdk //Dockerfile
├── LICENSE //LICENSE
├── NOTICE //NOTICE
├── README.md //README
├── README_CN.md //README
├── README_EN.md //README
├── TODO.md //将来要做的
├── agent //自定义Agent
├── as-package.sh
├── batch.as
├── bin
├── boot
├── client //Telnet客户端实现
├── common
├── core //Arthas的核心实现
├── demo
├── memorycompiler
├── mvnw
├── mvnw.cmd
├── packaging
├── pom.xml
├── site //一些站点信息,包含图片等
├── spy
├── static
└── testcase
阅读全文 »

shell的简单发展

基本上我们常用的是bash,它的全称是Bourne-Again SHell,而sh的全称则是Bourne shell,但是在系统中的/bin/sh其实是一个软连接,指向不同的shell(在ubuntu18上指向了dash,centos上指向了bash),在脚本中还是比较推荐写#!/bin/sh来指定shell的。

Bash的功能

  1. 可以查看历史
  2. 利用tab键进行补全命令或者文件,如果有插件的支持,还可以补全命令的选项
  3. 可以设置别名alias
  4. 控制jobs,这个比较推荐使用tmux
  5. wildcard的使用 ll /etc/a*

如果要查看一个命令的执行顺序,可以用type -a ls来查看,不仅可以告诉系统查询命令的顺序,还能告诉你指令是shell内置的。

阅读全文 »

最近看完了《SQL必知必会》,就是简单复习了SQL语句,概念比较少,但是觉得这本书还行,如果只是简单复习一下SQL语言的话。

1 简单介绍数据库

基本知道什么是模式,数据库和数据库管理软件(MySQL等)以及表之间的区别。记得所有的表都有一个主键,然后一般来说数据表之间都是有关系的。

2 简单检索数据

1
2
SELECT prod_id, prod_price, prod_name
FROM Products;

每一个列名之间用逗号分隔。如果只想要不同的值作为结果,可以用DISTINCT关键字,也可以用LIMIT来指定输出的列、利用OFFSET来说明偏移量。简单的注释是用--开头的,大段的注释和C语言一致。

3 排序数据

ORDER BY关键字可以指定用某个列来进行字典的排序,这里值得注意的是这个必须在最后一行出现。如果希望逆序,则可以使用DESC关键字。如果对于每个列都进行降序,需要为每个列都指定。

1
2
3
SELECT prod_id, prod_price, prod_name
FROM Products
ORDER BY 2 DESC, prod_name;
阅读全文 »