面试问题总结 taro Posted on Mar 29 2021 面经 # SQL注入 ## mysql 写文件 ``` http://127.0.0.1:81/sqli.php?id=1 into outfile 'C:\\wamp64\\www\\phpinfo.php' FIELDS TERMINATED BY '<?php phpinfo(); ?>' http://127.0.0.1:81/sqli.php?id=-1 union select 1,0x3c3f70687020706870696e666f28293b203f3e,3,4 into outfile 'C:\\wamp64\\www\\phpinfo.php' ``` ## 代替空格的方法 %0a、%0b、%a0 等 /**/ 等注释符 <> ## mysql 5.0 版本差别 5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名。 5.0以下是多用户单操作,5.0以上是多用户多操做。 ## SQLServer 注入 ## sleep和benchmark关键字被过滤掉了该怎么办 1.让两个非常大的数据表做笛卡尔积产生大量的计算从而产生时间延迟 2.如果服务器端采用长连接的话可以利用Mysql的锁机制即Get_lock() 3.利用复杂的正则表达式去匹配一个超长字符串来产生时间延迟 ## 未知列名情况下的注入利用 如果在利用SQL注入的时候遇到了WAF(安全狗3.5版本会直接拦截关键字information_shema),从而无法获取数据表的列名,这时该怎么利用漏洞呢? 利用虚表获取数据 # XSS ## 基于css的xss ## 基于flash的xss原理 # CSRF ## 防御 验证Referer 添加token ## token和referer做横向对比,谁安全等级高? token安全等级更高,因为并不是任何服务器都可以取得referer,如果从HTTPS跳到HTTP,也不会发送referer。并且FLASH一些版本中可以自定义referer。 但是token的话,要保证其足够随机且不可泄露。(不可预测性原则) ## 对referer的验证,从什么角度去做?如果做,怎么杜绝问题 对header中的referer的验证,一个是空referer,一个是referer过滤或者检测不完善。 为了杜绝这种问题,在验证的白名单中,正则规则应当写完善。 ## 针对token,对token测试会注意哪方面内容,会对token的哪方面进行测试? 针对token的攻击,一是对它本身的攻击,重放测试一次性、分析加密规则、校验方式是否正确等,二是结合信息泄露漏洞对它的获取,结合着发起组合攻击 信息泄露有可能是缓存、日志、get,也有可能是利用跨站 很多跳转登录的都依赖token,有一个跳转漏洞加反射型跨站就可以组合成登录劫持了 另外也可以结合着其它业务来描述token的安全性及设计不好怎么被绕过比如抢红包业务之类的 # SSRF ## 成因以及绕过 成因:模拟服务器对其他服务器资源进行请求,没有做合法性验证。 利用:构造恶意内网IP做探测,或者使用其余所支持的协议对其余服务进行攻击。 防御:禁止跳转,限制协议,内外网限制,URL限制。 绕过:使用不同协议,针对IP,IP格式的绕过,针对URL,恶意URL增添其他字符,@之类的。301跳转+dns rebindding。 # 上传 ## 上传绕过方式 - 前端js验证:禁用js/burp改包 - 大小写 - 双重后缀名 - 过滤绕过 pphphp->php ## 防护 - 文件上传目录设置为不可执行 - 使用白名单判断文件上传类型 - 用随机数改写文件名和路径 ## 导致文件包含的函数 PHP:include(), include_once(), require(), re-quire_once(), fopen(), readfile(), … JSP/Servlet:ava.io.File(), java.io.Fil-eReader(), … ASP:include file, include virtual # ARP欺骗 每台主机都有一个ARP缓存表,缓存表中记录了IP地址与MAC地址的对应关系,而局域网数据传输依靠的是MAC地址。 在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换。这样攻击者就有了偷听主机传输的数据的可能 ## 防护 1.在主机绑定网关MAC与IP地址为静态(默认为动态),命令:arp -s 网关IP 网关MAC 2.在网关绑定主机MAC与IP地址 3.使用ARP防火墙 # DDOS ## syn洪流的原理 伪造大量的源IP地址,分别向服务器端发送大量的SYN包,此时服务器端会返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP并不会应答,服务器端没有收到伪造IP的回应,会重试3~5次并且等待一个SYNTime(一般为30秒至2分钟),如果超时则丢弃这个连接。攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源(CPU和内存)来处理这种半连接,同时还要不断地对这些IP进行SYN+ACK重试。最后的结果是服务器无暇理睬正常的连接请求,导致拒绝服务。 ## CC攻击原理 对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。 # cors原理 # 同源策略 同源策略限制不同源对当前document的属性内容进行读取或设置。 不同源的区分:协议、域名、子域名、IP、端口,以上有不同时即不同源。 ## Jsonp安全攻防技术,怎么写Jsonp的攻击页面? JSON劫持、Callback可定义、JSONP内容可定义、Content-type不为json。 ```javascript function wooyun(v){ alert(v.username); } </script> <script src="http://js.login.360.cn/?o=sso&m=info&func=wooyun"></script> ``` Content-type不正确情况下,JSONP和Callback内容可定义可造成XSS。 JSONP和FLASH及其他的利用参照知道创宇的JSONP安全攻防技术。 # PHP ## php中命令执行涉及到的函数 1,代码执行:eval()、assert()、popen()、system()、exec()、shell_exec()、passthru(),pcntl_exec(),call_user_func_array(),create_function() 2,文件读取:file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()等 3,命令执行:system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open() ## 安全模式下绕过php的disable fuction DL函数,组件漏洞,环境变量。 # 数据库 ## 各种数据库文件存放的位置 - mysql:/usr/local/mysql/data/ C:\ProgramData\MySQL\MySQL Server 5.6\Data\ - oracle:\$ORACLE_BASE/oradata/\$ORACLE_SID/ # 入侵检测 ## 入侵 Linux 服务器后需要清除哪些日志? web日志,如apache的access.log,error.log。 直接将日志清除过于明显,一般使用sed进行定向清除 e.g. sed -i -e ‘/192.169.1.1/d’ history命令的清除,也是对~/.bash_history进行定向清除 wtmp日志的清除,/var/log/wtmp 登录日志清除 /var/log/secure /var/log/audit/audit.log ## 信息收集 ## rpm有个参数就可以校验命令是否被替换 ## 从内网突破到内网漫游的思路 ## IPC ## 权限提升 ### 查看当前端口连接的命令有哪些?netstat 和 ss 命令的区别和优缺点 ```shell netstat -antp ss -l ``` ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。 # 基础知识 ## TCP握手 ### TCP三次握手的过程以及对应的状态转换 1. 客户端向服务器端发送一个SYN包,包含客户端使用的端口号和初始序列号x; 2. 服务器端收到客户端发送来的SYN包后,向客户端发送一个SYN和ACK都置位的TCP报文,包含确认号xx1和服务器端的初始序列号y; 3. 客户端收到服务器端返回的SYNSACK报文后,向服务器端返回一个确认号为yy1、序号为xx1的ACK报文,一个标准的TCP连接完成。 ## TCP和UDP协议区别 tcp面向连接,udp面向报文 tcp对系统资源的要求多 udp结构简单 tcp保证数据完整性和顺序,udp不保证 ## https的建立过程 1. 客户端发送请求到服务器端 2. 服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在 3. 客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端 4. 服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端 5. 客户端使用共享密钥解密数据 6. SSL加密建立 # Reids ## redis写shell的过程,经过了哪些操作? ``` 192.168.63.130:6379> config set dir /var/www/html/ OK 192.168.63.130:6379> config set dbfilename shell.php OK 192.168.63.130:6379> set x "<?php phpinfo();?>" OK 192.168.63.130:6379> save OK ``` - 写shell - 写crontab - 写key ## redis拿下服务器权限的几种方法? 同上 ## redis反弹shell的原理是啥? 定时任务 ## windows redis如何拿下shell? ## redis在linux下如何写入公钥? 同上 ## redis写公钥和写crontab根据不同系统和不同情况都不是非常通用,有没有通用的方法? ## redis主从 上传恶意so,模拟fullresync请求 Linux MSF Persistence Kerberos