红日安全eb安全ay注入实战攻防

官方公众号企业安全新浪微博

FreeBuf+小程序把安全装进口袋

结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。

危害较高的漏洞,可以获取敏感信息,修改信息,脱裤,上传 webshell,执行命令。

数字上是不加单引号的如’2’+‘2’=‘22’而非’4’而2+2=4

sql注入主要是靠内联SQL来进行注入的and or 与或非的判断来进行内联SQL注入,等于在原先的语句上扩展出来的语句

报错注入顾名思义主要是利用数据库报错来进行判断是否存在注入点。如果不符合数据库语法规则就会产生错误。常用的特殊字符:’ \ ; %00 ) ( # "

1)函数length()计算数据库长度

2)函数left(a)=bsql的left()函数如果式子成立返回1如果不成立返回0

一般用来猜测库的名字3)函数substr()substr()和substring()函数实现的功能是一样的,均为截取字符串。substring(string, start, length)substr(string, start, length)length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本

可进行单字符验证可进行全字符验证4)函数mid()mid(string,start,length)string(必需)规定要返回其中一部分的字符串。start(必需)规定开始位置(起始值是 1)。length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本

可进行单字符验证可进行全字符验证

5)函数ascii()返回字符串str的最左字符的数值。返回0,如果str为空字符串。返回NULL,如果str为NULL。 ASCII()返回数值是从0到255;只会返回最左边字符的可以配合substr()

7)函数updatexml()

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。第三个参数:new_value,String格式,替换查找到的符合条件的数据在当前数据库中演示

8)函数exp()exp是以e为底的指数函数。可能会存在溢出

由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错

如果成功注入会正确显示内容,如果没成功会显示非正常内容。

没有任何报错显示,但是能根据页面是否正确显示来进行判断。如搜索注入没有内容,正常搜索应该是有内容的。

如果exp1为true返回值为sleep,如果为假返回值为1。ps:前提是网络延迟较低的情况。。

通过分号隔开执行多条语句。

前面不存在才会执行后面的语句,一般配合的是布尔类型的盲注

在存入数据库的时候做了过滤,但是取出来的时候没有做过滤,而产生的数据库注入。

数据库大多数为GBK才可以%df

cookie中的参数也有可能存在注入

Base64

X-Forwarded-for伪造客户端IP

dnslog

通过上述所有的注入方式进行组合攻击,如union+盲注

本地访问

limit 后使用 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1) 这种方式触发 sql 注入,受到 Mysql 版本的限制,其区间在 Mysql 5.1.5 - Mysql5.5 附近。

注释符号:--空格,/* */内联注释,# Mysql–后面要加一个空格或者控制字符要不无法注释‘a’ ‘b’=‘ab’

端口号:1433注释符号:--,/* */注释‘a’+‘b’=‘ab’

端口号:1521注释符号:--,/* */注释‘a’||‘b’=‘ab’

端口号:5432或者5433注释符号:--,/* */注释‘a’||‘b’=‘ab’

端口号:5000SQLite一种数据库文件,特别小,就一个库多个表,可用sqlite或者sqlite2打开

端口号:27017

ASP站点’or’=‘or’

前提:知道文件的绝对路径能够使用 union 查询对 web 目录有写的权限union select 1,load_file('/etc/passwd'),3,4,5#0x2f6574632f706173737764union select 1,load_file(0x2f6574632f706173737764),3,4,5#路径没有加单引号的话必须转换十六进制要是想省略单引号的话必须转换十六进制

前提:文件名必须是全路径(绝对路径)用户必须有写文件的权限没有对单引号'过滤

路径里面两个反斜杠\可以换成一个正斜杠/PHP 语句没有单引号的话,必须转换成十六进制要是想省略单引号'的话,必须转换成十六进制

建议一句话 PHP 语句转换成十六进制

这里我们采用DVWA靶场进行手工测试。

DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。

本地PHPStudy搭建DVWA靶机,放入www目录下即可环境使用PHP+MySQL即可。

(1)SQL Injection其他难度主要是为绕过手段。

判断是否存在注入在这里使用一个分号来进行扰乱数据库

查看数据库,发现命令没有生效

使用%23来把后面的内个分号进行注释,这里不能使用#因为#为php的锚点不会传递到服务器。可以正常查询

数据库中发现#把后面的引号注释掉了导致语句成功执行

利用这个特性来进行注入构造语句id=1'or 1=1%23因为后面1=1为真就会把全部的字段全部输出出来。

改一下代码显示sql语句。

(2)堆叠注入

不知道为何会报错把这条语句复制下来在mysql命令行输入没有报错正常显示

第一步先进行字段数量判断order by xx

order by 3的时候出现了报错说明为2个字段代码中也能体现,但是如果是渗透测试是看不见数据库命令的只能通过这个去尝试

得出2个字段后进行union注入id=1'union+select+1,2%23

1和2都显示了说明都可以进行替换。

first_name,password再去构造查询语句

直接去查询他的表对应的字段就简单了

所以只需要记住information_schema库下的columns表中的字段就可以了库是table_schema,表是table_name,字段是column_name

盲注即为不回显内容需要进行尝试根据页面返回的内容是否正常来进行判断

说明存在盲注

(5)内联注入

直接用内联注入简单快捷。。

用length(database())=xx来判断数据库名长度如果成立就会返回正常

说明数据库名为4位

1' and mid(database(),1,1)<'g'#使用mid来判断数据库第一位的内容只需要修改第二个标志位来判断位数如果为正确就会返回存在ID

1' and mid(database(),2,1)='v'#

后面就省略了。之后会有脚本教学进行判断

(1)SQL Injection

只做绕过不进行详细测试。

发现只是改成了POST型,加了个过滤特殊符号的函数,改成了数字型注入。

成功注入

一样就是改成了POST和过滤,数字型盲注。

正常绕过了

(1)SQL Injection

通过外部传递进来的session的id和限制一次只能显示一行

绕过了limit的限制

成功注入

需要特别提到的是,High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。

跟上面差不多这个是Cookie的传递id,limit也是限制显示一行

成功绕过

(1)SQL Injection

做了个CSRF的防御,使用了PDO进行了分离数据和参数

先判断了一下id是否为数字如果不为数字直接就会跳过数据库查询,bindParam把id转换为int型,防止输入的数字为字符。进行查询有效限制了恶意构造语句

(2)SQL Injection(Bind)

跟如上一样

继续对DVWA靶场进行测试。

多用于盲注,这里只演示盲注

(1)Options

(2)Target

(3)Request

(4)Optimization

(5)Detection

(6)Techniques

(7)Fingerprint

(8)Enumeration

(9)Brute force

(10)User-defined function injection

(11) File system access

(12) Operating system access

(13) Windows registry access

(14) General

(15) Miscellaneous

(1)查看当前数据库

(2)查看当前用户

(3)查看全部数据库

(4)查看数据库全部表

(5)查看表字段

(6)查看数据

WebGoat是OWASP组织研制出的用于进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。

(1)SQL Injection (advanced)

输入除非字符型注入admin' or '1'='1

7能正常显示8就不可以正常显示了说明字段为7个

Smith' union select 1,'2','3','4','5','6',7 from user_data --

Smith' union select 1,database(),user_name,password,'5','6',7 from user_system_data --

(2)SQL Injection (mitigation)

防御sql注入,其实就是session,参数绑定,存储过程这样的注入。

上面说的方式也不是能够绝对的进行sql注入防御,只是减轻。

如参数绑定方式可以使用下面方式绕过。通过使用case when语句可以将order by后的orderExpression表达式中添加select语句。

Damn Small Vulnerable Web (DSVW) 是使用 Python 语言开发的 Web应用漏洞 的演练系统。其系统只有一个 python 的脚本文件组成, 当中涵盖了 26 种 Web应用漏洞环境, 并且脚本代码行数控制在了100行以内, 当前版本v0.1m。需要python (2.6.x 或 2.7)并且得安装lxml库

安装python-lxml,再下载DSVW

(1)Blind SQL Injection (boolean)

说明存在盲注

构造语句进行盲注,发现不能使用mid只能使用substr。。

(2)Blind SQL Injection (time)

(3)UNION SQL Injection

基于联合查询注入: 使用UNION运算符用于SQL注入,UNION运算符是关联两个表的查询结果。攻击者故意伪造的恶意的查询并加入到原始查询中, 伪造的查询结果将被合并到原始查询的结果返回,攻击者会获得其他表的信息。

这里我们采用Vulnhub靶场进行演练。

Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目标。

Graceful的VulnVM是在虚拟机上运行的Web应用程序,它旨在模拟一个简单的电子商务风格网站,该网站特意容易受到Web应用程序中常见的许多众所周知的安全问题的影响。这实际上是该项目的预发布预览版,但它确实具有实用性,但我计划在不久的将来对此进行大量工作。

该计划最终使应用程序容易受到大量问题的影响,选择不同的过滤器处于不同的困难,以便测试人员能够更好地检测和利用应用程序可以通过常见的开发方法加强的问题,以便测试人员能够更广泛的经验。

第一批过滤器现已实施!该应用程序现在支持“级别”,其中级别1不包括用户输入的实际过滤,级别2包括针对每个易受攻击的功能的简单过滤器。

构造语句爆破数据库名,使用之前的python脚本进行爆破。

爆破出来数据库名为seattle

判断出来数据库存在3个表

三个表名

开始爆字段,用如下语句

一直爆不出来字段,发现原来是这种爆破脚本存在一个无法分辨大小写的问题。改进一下脚本,变成ASCII的判断。

重新尝试爆破字段,改一下语句,用python来跑

再去爆破数据。用户名

密码

说明存在5个字段

进行UNION注入构造语句,发现并没有显示位。所以只能进行报错盲注了

跟上面几乎一样,就是利用的地方不一样

可以自定义关键字建立数组即可

把查询语句弄成一个对象,通过函数判断输入进来的值是否为数字,然后再通过正则替换内容

使用参数化查询可有效避免SQL注入

五指互联由原盛大集团PHPCMS负责人王参加创办,汇聚众多国内资深CMS开发者,拥有一支战斗力强、专业的技术团队,有超过10年的CMS专业开发经验。

网站源码版本:五指CMS v4.1.0 UTF-8 开源版

构造url链接,使用SQLMAP可获取数据库敏感数据。

Payload:

抓包把数据包放到sqlmap上跑

可以自定义关键字建立数组即可

把查询语句弄成一个对象,通过函数判断输入进来的值是否为数字,然后再通过正则替换内容

使用参数化查询可有效避免SQL注入

单引号(’)双引号(")反斜杠(\)NULL

预定义的字符是:& (和号)成为 &" (双引号)成为 "’ (单引号)成为 ’<>成为 <>就是把成变成一个纯字符(:з」∠)

会在以下关键词前面添加转义字符单引号(’)双引号(")反斜杠(\)NULL

THE END
0.字符串字符串包含几个指定字符C语言提供了字符串的定义,就是使用一对双引号包含的字符,称为字符串。例如"abcde", "123", "www.xxx.com"都表示一串字符串。 注意:C语言规定,字符串必须以'\0'字符作为最后一个字符,表示字符串的结束字符,称为:字符串结束符。字符串结束符'\0'的ASCII是0数值。 jvzquC41dnuh0lxfp0tfv8kgpi7::@56345bt}neng5eg}fknu522A88;378
1.python字符串方法的简单使用山里的小勇子学习python字符串方法的使用,对书中列举的每种方法都做一个试用,将结果记录,方便以后查询。 (1) s.capitalize() ;功能:返回字符串的的副本,并将首字母大写。使用如下: 1>>> s ='wwwwww'2>>> scap =s.capitalize()3>>>scap4'Wwwwww' (2)s.center(width,char); 功能:返回将s字符串放在中间的一个jvzquC41yy}/ewgnqiy/exr1ycthzrfq{qth1y4789>97@3jvor
2.全部内置字符串函数用法详解FIND_IN_SET 在以逗号分隔的字符串中查找指定字符串的位置。 FORMAT_NUMBER 将数字转化为指定格式的字符串。 FROM_CHARSET 将指定编码格式的二进制数据转换为UTF-8格式的字符串。 FROM_JSON 根据给定的JSON字符串和输出格式信息,返回ARRAY、MAP或STRUCT类型。 GET_JSON_OBJECT 在一个标准JSON字符串中,按照指定方式jvzquC41jgrq0jqk{wt/exr1fqivonsvafkucrq16:?857mvo
3.python练习之查找一个文件中的字符串是否在另一个文件中存在Python正则表达式实战教程:通过代码示例演示如何使用re模块进行文本匹配。从hello.txt和world.txt文件中读取内容,使用正则搜索匹配字符串并输出结果。包含完整代码实现和运行效果展示,帮助开发者快速掌握Python正则表达式应用技巧。jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk03?6;;3;
4.ewwwwcxxxx神秘代码探索之旅,揭秘数字序列背后的意义,解开网络李贺是中唐的浪漫主义诗人,与李白、李商隐称为唐代三李,是中唐到晚唐诗风转变期的一个代表者。他所写的诗大多是慨叹生不逢时和内心苦闷,抒发对理想、抱负的追求。二、唐诗背景 在隋末的农民蜂起的大起义中,原隋朝大官李渊和他的儿子们(世民与兄建成),其中李世民功劳卓著。公元618年,李渊在长安关于春夏秋冬的诗句不是诗,关于写春的诗句 jvzq<845i0yeeq}|0et0mwnhg1723@4:;77:2h:9378/j}r
5.Ruby字符串操作和文本处理的高效方法有哪些?Ruby,一种以简洁、优雅和强大著称的面向对象编程语言,被广泛用于Web开发、脚本编写、自动化任务等多个领域。在Ruby中,字符串操作和文本处理是常见的编程任务,因此掌握高效的方法对于提高代码性能和可读性至关重要。本文将详细介绍Ruby中字符串操作和文本处理的高效方法。 jvzq<84yyy463}juvkth0lto1ouckuj1xkkx0ymrAkzfori?9:689?:
6.PythonSyntax特别地,可以用[-l:]来截断后l个字符的字符串,其中-1是最后一个字符的索引值 格式化输出 格式化字符串与c/cpp相同,参数则有一定的格式,如"%d %d" % ( 1 , 2 ),在字符串后使用%(,)的格式进行调用 f-string f-string 是 python3.6 之后版本添加的,称之为字面量格式化字符串,是新的格式化字符jvzq<84jqok/w|ye0gjv0ls1€vgp{jsia46148gnqi5qq|yu1rujxsu{pzbz8
7.应用层协议之HTTP协议|初学教程let是在定义变量,这里的body就是一个js对象,在ajax中data就是正文部分,JSON.stringify(body)表示把body这个js对象转成字符串。 注意:url一定要写在body之前。 四.Https HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了加密 1.啥是加密 加密就是把明文(要传输的信息)进行一系列变换,生成密文;解密就是把密文jvzquC41ej{ywnokcqiigwl0eqs02<::9c;c8>3jvor
8.String字符串操作大全string里的字符String s = "www.baidu.com"; char result = s.charAt(6); System.out.println(result); //结果为 i AI写代码 1 2 3 4 6.把这个字符串和另一个对象比较: 语法:int compareTo(Object o) 或者 int compareTo(Stringstr) o: 要比较的对象 str: 要比较的字符串 jvzquC41dnuh0lxfp0tfv8vsa5>47B;:71gsvrhng1jfvjnnu171:A:5;4>
9.字符串操作实战C语言——字符串专项练习 1.给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)。 样例: 对于字符串 "abcdefg". offset=0 => "abcdefg" offset=1 => "gabcdef" offset=2 => "fgabcde" offset=3 => "efgabcd" 要求使用函数:jvzquC41dnuh0lxfp0tfv8|gkzooa?6:9;<1:8ftvkimg8igvcomu86447<47:=
10.String常用方法yuedongfan17.String.replace(oldstr, newstr); 返回一个新的字符串,其中oldstr被newstr替换。 1String str = "XXX今天真好运!";2String str1 = str.replace("XXX", "王五");3System.out.println(str);//XXX今天真好运!4System.out.println(str1);//王五今天真走运jvzquC41yy}/ewgnqiy/exr1{wkeqwl/Lc|bPxygu1v03?9:48?80qyon
11.字符串中不属于指定集合的字符&&检查一个字符串是文本还是二进制过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素。 解决方案: importstring allchars= string.maketrans('','')#all chars tabledefmakefilter(keep): delchars=allchars.translate(jvzquC41yy}/ewgnqiy/exr1yw€ikvnpi1v05B87487/j}rn
12.常用的字符串基本操作和扩展。swiftstring长度比较intend=str.indexOf(".",start);//获取第二个点的位置 Stringsub=str.substring(start,end); System.out.println(sub); AI写代码java 运行 输出结果 www.baidu.com baidu AI写代码java 运行 给予一个下标,返回下标所在位置的字符 如我想取出字符串中的第五个字符(下标从0jvzquC41dnuh0lxfp0tfv8~cgtvj1jwvkerf1mjvckrt1@>58:;38
13.基础学习——python基础str(float) 浮点值 -> 字符串 3.控制流 If-else 检测真值的优雅方式是这样的: if x: pass 不要像下面这样做: if x == True: pass 它可以写作中括号之间的一列逗号分隔的值。列表的元素不必是同一类型: 切片并不会改变正在操作的列表,切片操作返回其子列表,这意味着下面的切片操作返回列表一个新的(栈)jvzquC41dnuh0lxfp0tfv8oklgxs{8ftvkimg8igvcomu8=684:58;
14.Python编程练习题本文提供了一系列Python编程练习题目,涵盖循环、条件判断、字符串操作、列表处理等方面,适合初学者实践提升。 1. 带循环和条件判断的给定一个数值num, 用户输入使用raw_input()函数来提示用户输入一个1和100之间的数, 如果用户输入的数等于num, 显示成功并退出。否则显示一个错误信息然后再次提示用户输入数值,直到满足jvzquC41dnuh0lxfp0tfv8mgjgnfeqjp1cxuklqg1fkucrqu19?6;A<:6
15.纯JS实现在一个字符串b中查找另一个字符串a出现的所有位置,并且不问题:判断字符串A在中所有出现字符串B中(长度大于1)的索引。不得使用字符串方法indexof,substring等 有小伙伴在面试遇到了这个问题,乍一看如果使用使用字符串方法indexof,substring,很简单容易实现,但如果不使用这些方法,怎么样才能实现这个需求呢 // 思路: 如果不能使用字符串的相应方法,我们可以把字符串转换成数组jvzquC41enuvf7ygpekov7hqo1jfxnqqrgx0c{ykenk03?>7637
16.正则表达式实战指南7.^字符串开始 这里的^跟[]里面用的^是同一个字符,但是却不是一个意思,这里它表示整个字符串的开始,比如^www表示以www开头的字符串,注意区分,不在[]里面的是开始符,在里面的排除 8.$字符串结束 9.{1,3}循环次数 [0-9]{1,3}表示在0-9的范围里面循环1个、2个或者3个,可能结果有5、20、415等。 如果循环指定 jvzquC41dnuh0lxfp0tfv8hwpl{f1jwvkerf1mjvckrt1>76268:4
17.使用说明·Axios中文说明·看云// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URLbaseURL:'https://some-domain.com/api/',// `transformRequest` 允许在向服务器发送前,修改请求数据// 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法// 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 StreamjvzquC41yy}/mjsenq{e0ls1{wtzg8fzkqy04<9:67
18.全部内置字符串函数用法详解FIND_IN_SET 在以逗号分隔的字符串中查找指定字符串的位置。 FORMAT_NUMBER 将数字转化为指定格式的字符串。 FROM_CHARSET 将指定编码格式的二进制数据转换为UTF-8格式的字符串。 FROM_JSON 根据给定的JSON字符串和输出格式信息,返回ARRAY、MAP或STRUCT类型。 GET_JSON_OBJECT 在一个标准JSON字符串中,按照指定方式jvzquC41jgrq0jqk{wt/exr1|j5nchqor{ug8zugt3hwrig1uzskwl/hwtdvrtpu
19.百度试题下程好1a46cc1.请设计一个字典。以字符串为索引,存储用户定义的定长结构。要求有增、删、查、改的功能。已经给定一个函数,可以由字符串映射到一个签名,每个签名由两个unsigned int类型组成。假设每一个字符串能够对应唯一的一个签名,完全没有重复(或者重复的概率可以忽略),并且签名分布足够均匀。 jvzquC41dnuh0lxfp0tfv8feg|nbpphwp{o0c{ykenk0fnyckny08?>4728
20.阿里巴巴算法岗武功秘籍(中)(解法:使用归并思想,从第一个字符(a)的倒排索引开始,找仅比当前索引大的第二个字符(b)的索引,直到最后一个字符,计算窗口大小,保留最小值,时间复杂度:各字符倒排索引数组大小相加(线性),空间复杂度,O(1)? ● 从字符串中提取所有有效的ip地址? ● 给定一个字符串,和字符串列表,判断能否用字符串列表拼接生成jvzquC41yy}/hu~ck0ipo8ftvkimg8>48
21.易名老域名购买域名买卖到期域名查询域名注册易名(ename.com)国内外知名的域名交易平台,专注域名垂直领域提供域名买卖交易、到期域名查询、老域名购买、一口价、竞价、经纪中介交易等域名个性化域名服务,一个域名成就一个梦想。jvzquC41yy}/gwfog0ipo8
22.Java编程基础与实践17、String[] strs = s.split("a");让a切割字符串s。 18、中文一个字是两个字节,英文是一个字节。s.getbytes().length!=s.length()表示有中文; 19、作业6:“http://localhost:8080/LCRMS/resumeAdd.do/"取出resumeAdd字符串。 20、prperties类实现了从名字到值的映射。 jvzquC41dnuh0lxfp0tfv8rwzkjsgjrvqjou1jwvkerf1mjvckrt1A54:7?8
23.输入n个字符串字典序排序本文介绍了一种算法,用于解决给定字符串列表时如何通过连接字符串并适当反转以获得字典序最大的循环字符串的问题。文章提供了详细的解题思路及Java、Python和C++的实现代码。 LintCode 876. 连接字符串 LintCode 领扣​www.lintcode.com 题目描述 给定一个字符串列表,你可以将这些字符串连接到一个循环中,在连入循jvzquC41dnuh0lxfp0tfv8|gkzooa<>:49=::8ftvkimg8igvcomu8632:>53A=
24.给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串思路:回文串的特点是,逆序输出和正序输出是一样的。所以这道题可以从这方面来考虑。如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数。 求LCS的方法可以在csdn中找到。 importjava.util.*;publicclassMain{publicstaticvoidmain(String[] args){ ScajvzquC41yy}/ewgnqiy/exr1{kthr~4r17>2;><20jznn